如果STL容器中的迭代器失效,指针是否也会失效?
Does a pointer become invalidated if an iterator is invalidated in STL containers
我试图理解向量迭代器失效的概念。从我所做的一些阅读中,我发现如果一个向量包含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
所有的迭代器和引用都失效,除非被擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对被擦除元素的引用失效。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 不明白迭代器,引用和指针失效,一个例子
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- std::unordered_map::提取引用/指针失效
- std::vector, std::move 和指针失效
- 如果我不使用 vector.reserve(),为什么我的指针会失效?
- 调整窗口内存映射文件的大小,而不会使指针失效
- 指向已销毁类失效的指针
- 迭代器与指针(引用)的双插入失效
- 为什么共享指针在修改后要失效
- 如果STL容器中的迭代器失效,指针是否也会失效?
- 使用pop_back时防止指针失效
- 使已删除的指针失效
- 如何在不使指向它的指针失效的情况下增长缓冲区