簡體   English   中英

如果迭代器在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將無效嗎? 如果不能,您是否可以給出迭代器無效但指針仍然有效的情況? 我目前對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

我很驚訝為什么向量沒有提到迭代器是無效的,因為這是在刪除元素之前獲得的迭代器。

刪除項目時,不同的容器行為不同。

http://en.cppreference.com

std::vector::erase

在擦除點或擦除點之后使迭代器和引用無效,包括end()迭代器。

std::map::erase

對已刪除元素的引用和迭代器無效。 其他引用和迭代器不受影響。

std::deque::erase

除非已刪除的元素位於容器的末尾或開始,否則所有迭代器和引用都將無效,在這種情況下,僅迭代器和對已擦除元素的引用將無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM