容器迭代器和对容器的操作

container iterators and operations on containers

本文关键字:操作 迭代器      更新时间:2023-10-16

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

#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<<" ";
}

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

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

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

当标准说迭代器无效时,这并不能保证它们在阻止程序工作的意义上将是无效的。使用无效迭代器是未定义行为,这是c++中一个巨大而重要的主题。这并不意味着你的程序会崩溃,但确实有可能。您的程序可能还会做一些其他的事情——行为是完全未定义的。