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

Does a pointer become invalidated if an iterator is invalidated in STL containers

本文关键字:失效 指针 是否 迭代器 STL 如果      更新时间:2023-10-16

我试图理解向量迭代器失效的概念。从我所做的一些阅读中,我发现如果一个向量包含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也会失效吗?如果不是,你能给出迭代器失效但指针仍然有效的情况吗?我目前对矢量,地图和deque感兴趣。

更新:所以我写了一小段代码并进行了实验

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

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

当你删除一个条目时,不同的容器表现不同。

从http://en.cppreference.com

:

std::vector::erase

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

std::map::erase

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

std::deque::erase

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