今天我正在玩一些标准的库函数..并且每当容器使用(在这种情况下为vector)时,std :: transform()和std :: back_inserter都会发现这个奇怪的输出,其中包含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;
}
答案 0 :(得分:2)
最可能的原因是,当vector
元素进入push_back
元素时,back_insert_iterator
的存储空间将被重新分配(分配给begin
的结果)。这使传递给end
的{{1}}和transform
迭代器无效,后续分配会导致未定义的行为。
如果您在致电reserve()
之前vector
transform
有足够的空间,则可以解决您的问题
vector<int> v2(3,3);
v2.reserve(v2.size() * 2);
transform(v2.begin(),v2.end(),back_inserter(v2),change);
这会产生所需的输出。
3 3 3 9 9 9