我试图理解向量中迭代器失效的概念。 从我所做的一些阅读中我发现,如果一个向量包含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
我很惊讶为什么向量没有提到迭代器是无效的,因为这是在删除元素之前获得的迭代器。
答案 0 :(得分:1)
删除项目时,不同容器的行为会有所不同。
在擦除点或之后使迭代器和引用无效,包括
end()
迭代器。
擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。
除非擦除的元素位于容器的末尾或开头,否则所有迭代器和引用都将失效,在这种情况下,只有迭代器和对擦除元素的引用才会失效。