解除引用迭代器向量时的分段错误

时间:2016-06-20 20:17:34

标签: c++ vector iterator

我想使用迭代器向量链接到向量的内容< INT取代。
当我尝试通过单个迭代器“it”填充所述迭代器向量时,当我尝试取消引用它时,我得到了一个分段错误。

vector <int> vec;
vector <int>::iterator it = vec.begin();
vector<vector <int>::iterator> vecIt(3);
vec.push_back(1);    
vec.push_back(2);
vec.push_back(3);
vecIt[0] = it;

cout << *vecIt[0] << endl; //this line causes seg. fault

但是,如果我不使用我的“it”迭代器,它就可以正常工作:

vector <int> vec;
vector<vector <int>::iterator> vecIt(3);
vec.push_back(1);  
vec.push_back(2);
vec.push_back(3);
vecIt[0] = vec.begin();

cout << *vecIt[0] << endl;

有人可以向我解释这种行为吗?是什么导致了seg。使用额外的迭代器时出错?
此外,是否有更好的方式来通过我的矢量&lt; INT&GT;并将迭代器(或指针,如果这是更可取的)保存到迭代器的向量中?

2 个答案:

答案 0 :(得分:4)

来自:http://en.cppreference.com/w/cpp/container/vector/push_back

  

如果new size()大于capacity(),则所有迭代器和引用(包括last-the-end迭代器)都将失效。否则只有过去的迭代器无效。

因此,通过获取迭代器(它也是一个空向量),然后通过调用push_back()使向量的大小超过其容量,您将使迭代器无效。但是,当您执行push_back()然后获取迭代器时,由于向量的大小不超过其容量,因此不会发生失效。

答案 1 :(得分:3)

通过

推送新元素时
vec.push_back(1);

迭代器失效。参见例如在cplusplus

  

如果发生重新分配,则与容器相关的所有迭代器,指针和引用都将失效。   否则,只有结束迭代器无效,并且所有迭代器,指针和对元素的引用都保证在调用之前保持引用它们所引用的相同元素。