容器

时间:2015-09-14 12:54:24

标签: c++ stl iterator 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<<" ";
}

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

我认为beg迭代器会指向新添加的元素,而mid迭代器会指向前一个指向中间的元素(它是&#39; s就像迭代器指向相同的内存位置,而底层数组,#34;滑动&#34;下...除非重新分配,否则就是

有人可以解释一下这种行为吗?

1 个答案:

答案 0 :(得分:5)

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