std :: transform产生奇怪的输出

时间:2014-08-01 00:35:00

标签: c++ c++11 stl

今天我正在玩一些标准的库函数..并且每当容器使用(在这种情况下为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;  
}  

1 个答案:

答案 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

Live demo