如果迭代器在STL容器中失效,指针是否会失效

时间:2015-09-26 04:53:56

标签: c++ pointers stl iterator

我试图理解向量中迭代器失效的概念。 从我所做的一些阅读中我发现,如果一个向量包含7个元素而你删除了第5个索引上的元素,那么从第5个元素开始的迭代器就会失效。这是因为第5个索引之后的所有元素都需要向上移动一个槽。这对我来说很有意义但是我在以下两种情况之间有点混淆

    std::vector<foo> vec {foo{1},foo{2}};              //foo is a simple class
    foo* ptr = &vec[0];                                //Case 1
    std::vector<foo>::iterator it = vec.begin() + 1;   //Case 2

对于STL容器,如果迭代器失效,那么指针也会失效吗?例如,如果it失效,ptr也会失效吗?如果没有,你能否给出迭代器失效但指针仍然有效的情况?我目前对矢量,地图和deques很感兴趣。

更新 所以我写了一些代码并进行了实验

std::vector<foo> vec {foo{1},foo{2},foo{3}};
foo* ptr = &vec[1];
std::vector<foo>::iterator it = vec.begin() + 1;
std::cout << "Before : " <<  ptr->a << "\n";
vec.erase(vec.begin() + 1); //Remove the second element
std::cout << "Iterator value : " << it->a << "\n";
std::cout << "After : " <<  ptr->a << "\n";

结果是

Before : 2
Iterator value : 3
After : 3

我很惊讶为什么向量没有提到迭代器是无效的,因为这是在删除元素之前获得的迭代器。

1 个答案:

答案 0 :(得分:1)

删除项目时,不同容器的行为会有所不同。

来自http://en.cppreference.com

std::vector::erase

  

在擦除点或之后使迭代器和引用无效,包括end()迭代器。

std::map::erase

  

擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。

std::deque::erase

  

除非擦除的元素位于容器的末尾或开头,否则所有迭代器和引用都将失效,在这种情况下,只有迭代器和对擦除元素的引用才会失效。