c++ iterator 在迭代时push_back报错.

浏览:29日期:2023-06-05

问题描述

#include <vector>#include <stdio.h>#include <iostream>using namespace std;int main(){vector<int > v;auto iter = v.begin();vector<int>::iterator iter2=v.begin();v.push_back(4);cout<<'int0 '<<v[0]<<endl;cout<<'iter2'<<*iter2<<endl; //到这里就报错.为什么?cout<<'int'<<*iter<<endl;return 0;}

g++ iterTest.cpp -std=c++11 -o iterTest

问题解答

回答1:

一般情况下,迭代过程中不允许修改数据源,如果数据源变化,必须重新迭代

回答2:

#include <vector>#include <stdio.h>#include <iostream>using namespace std;int main(){vector<int> v;v.push_back(4);vector<int>::iterator iter2=v.begin();auto iter = v.begin();cout<<'int0 '<<v[0]<<endl;cout<<'iter2'<<*iter2<<endl; //到这里就报错.为什么?cout<<'int'<<*iter<<endl;return 0;}

这样就好了。

因为vector是动态增长的容器,当创建一个容器v,此时里面的元素为空,并且capacity容量也为0,此时执行begin()返回的迭代器与end()返回的相同。接着向里面添加元素时,标准库会自动为其新分配一段可以容纳该元素的内存空间,并将该元素存储进去,之前的迭代器就失效了。所以解引用时,该迭代器所指的位置并没有元素,报错。

回答3:

int main(){vector<int > v;v.push_back(4);vector<int>::iterator iter2=v.begin();cout<<'iter2'<<*iter2<<endl;return 0;}

代码如上调整,因为v.begin()指向的是vector的第一个元素,而你vector<int> v初始化的时候里面并没有插入任何数值,vector为空,所以你运行时出错,你必须插入至少一个元素后,再用v.begin()去实例化iterator的值,才能保证指向的迭代器是正确的迭代器

相关文章: