Jan*_*ora 2 c++ iterator vector c++11
我编写了以下程序,用于将值推送和打印到矢量中.似乎如果我从向量推送以及打印值,它会给我未定义的行为.例如,我的预期输出应该是:(1,3,4,5),而我得到的输出为(0,3,4,5).有人可以解释我哪里出错了.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<unsigned> vec;
vec.push_back(1); vec.push_back(3); vec.push_back(4); vec.push_back(5);
for(vector<unsigned>::iterator i=vec.begin(), l=vec.end(); i!=l; ++i){
vec.push_back(2);
cout<<(*i)<<"\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,这是一种不确定的行为.当在循环内部调用std :: vector :: push_back时,迭代器i可能会失效(如果重新分配发生),那么对它的操作就像*i是UB.而且l一定会失效.
如果new
size()大于,capacity()则所有迭代器和引用(包括过去的迭代器)都将失效.否则只有过去的结束迭代器无效.
你可以使用std :: vector :: reserve来避免重新分配,从而避免失效i.例如
vector<unsigned> vec;
vec.push_back(1); vec.push_back(3); vec.push_back(4); vec.push_back(5);
vec.reserve(vec.size() * 2);
for(vector<unsigned>::iterator i = vec.begin(); i != vec.end(); ++i) {
cout<<(*i)<<"\n";
vec.push_back(2);
++i;
cout<<(*i)<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
请注意,您应该vec.end()直接使用以避免l(过去的结束迭代器)失效,并++i在迭代结束时使用两次以避免无限循环.