今天我正在玩一些标准的库函数......并发现这个奇怪的输出来自std::transform((和std::back_inserter每当容器正在使用(在本例中为vector(有超过2个元素时。我不明白这种行为,那里的任何人都可以帮助我......
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
/* this version of change works fine for me when i store the incoming value into a
static variable
int change(int n){
static int m=n;
return m * m;
}*/
int change(int n){
return n*n;
}
int main(){
vector<int> v2(3,3),
v1;
transform(v2.begin(),v2.end(),back_inserter(v2),change);
for(auto v: v2)
{
cout << v <<" "; // prints out a strange random 5th value in v2.
}
return 0;
}
最可能的原因是,当您将元素push_back
到vector
时,的存储被重新分配(这就是分配给back_insert_iterator
的结果(。这会使传递给transform
的begin
和end
迭代器无效,后续赋值会导致未定义的行为。
如果您在呼叫transform
之前reserve()
vector
有足够的空间,则可以解决您的问题
vector<int> v2(3,3);
v2.reserve(v2.size() * 2);
transform(v2.begin(),v2.end(),back_inserter(v2),change);
这将产生所需的输出。
3 33 9 9 9
现场演示