gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:38:25 29 4
gpt4 key购买 nike

我试图理解 vector 中迭代器失效的概念。从我所做的一些阅读中,我发现如果一个 vector 包含 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 也会无效吗?如果不能,您能否给出一个迭代器失效但指针仍然有效的情况?我目前对 vectors 、 maps 和 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

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

最佳答案

当您移除一个项目时,不同的容器会有不同的行为。

来自 http://en.cppreference.com :

std::vector::erase

Invalidates iterators and references at or after the point of the erase, including the end() iterator.

std::map::erase

References and iterators to the erased elements are invalidated. Other references and iterators are not affected.

std::deque::erase

All iterators and references are invalidated, unless the erased elements are at the end or the beginning of the container, in which case only the iterators and references to the erased elements are invalidated.

关于c++ - 如果迭代器在 STL 容器中失效,指针是否失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793784/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com