容器迭代器和容器操作

container iterators and operations on containers

我正在学习 C++,并且正在阅读有关 STL 容器、迭代器以及可以对它们执行的操作的信息。 我知道每个容器类型(或者更好的是,每个类型都是一个实例的相应模板)都定义了一个类似于指针类型的 companio 类型,它被称为迭代器。我的理解是,一旦你得到一个容器的迭代器,执行像添加元素这样的操作可能会使该迭代器无效,所以我试着用一个例子来测试这个语句:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
  vector<int> ivec={1,2,3,4,5,6,7,8,9,0}; 
  auto beg=ivec.begin();
  auto mid=ivec.begin()+ivec.size()/2;
  while (beg != mid) {
    if (*beg==2) 
      ivec.insert(beg,0);
    ++beg;
  }  
  for (auto i:ivec)
    cout<<i<<" ";
}

在这里,我只是构造一个整数向量,用大括号对其进行初始化,并执行基于条件的操作,在容器的前半部分插入一个元素。 我认为代码有缺陷,因为我正在初始化两个迭代器对象 begend 然后我在 while 语句中使用它们作为条件。 但是,如果代码应该更改容器的内容(它肯定会更改)迭代器会发生什么? 代码似乎运行就好了,它在ivec[1]位置添加一个0并打印结果。

我认为 beg 迭代器会指向新添加的元素,而 mid 迭代器会指向之前由 mid 指向的元素(就像迭代器指向相同的内存位置,而底层数组 "slides" 在..下,除非它被重新分配)

谁能给我解释一下这种行为??

当标准说迭代器无效时,这并不能保证它们 在阻止程序运行的意义上是无效的。使用无效的迭代器是 未定义的行为,这是 C++ 中一个巨大而重要的话题。这并不意味着您的程序会崩溃,但它可能会崩溃。您的程序可能还会执行其他操作——行为完全未定义。