[英]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
將無效嗎? 如果不能,您是否可以給出迭代器無效但指針仍然有效的情況? 我目前對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
我很驚訝為什么向量沒有提到迭代器是無效的,因為這是在刪除元素之前獲得的迭代器。
刪除項目時,不同的容器行為不同。
在擦除點或擦除點之后使迭代器和引用無效,包括
end()
迭代器。
對已刪除元素的引用和迭代器無效。 其他引用和迭代器不受影響。
除非已刪除的元素位於容器的末尾或開始,否則所有迭代器和引用都將無效,在這種情況下,僅迭代器和對已擦除元素的引用將無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.