C++Primer上,有这样一段描述“虽然Vector对象可以动态增长,但也会有一些副作用,已知的一个限制是不能在范围for循环中向vector对象中添加元素。另外一个限制是任何可能改变vector对象容量的操作都会使得vector迭代器失效。”
验证了一下。
std::vector<int> v1(10, 1);
const std::vector<int> v2 = v1;
auto it1 = v1.begin();
auto it2 = v2.begin();
std::cout << typeid(it1).name() << ' ' << sizeof(it1) << *it1 << std::endl;
std::cout << typeid(it2).name() << ' ' << *it2 << std::endl;
v1.push_back(2);
it1++;
std::cout << *it1 << std::endl;
每次运行到最后一句时都会报错,显示Mycont是nullptr
然后去查看了内存。
在运行push_back之前,迭代器指向的是内存中vector的_Myfirst。
运行push_back之后,vector对象的_Myfirst发生了改变,也就是说vector的动态增长本质是建立新的长度的vector并将自身进行复制(猜测)。所以每一次动态增长后_Myfirst都发生了变化,因而过去的迭代器失效了。