簡體   English   中英

C++ 向量插入和迭代器混淆

[英]C++ Vectors insertion and iterators confusion

int main(){
    vector<int> veclist;
    veclist.push_back(90);
    veclist.push_back(80);
    veclist.push_back(70);

    vector<int>::iterator it;
    it=veclist.begin();
    veclist.insert(it,20);
    cout << *it << endl;  // prints 20 
    it++;
    veclist.insert(it,99);
    cout << *it <<endl;  // line abc : prints 0 
}

嗨,我正在使用 C++ 中的向量和迭代器。 在上面的代碼中,為什么 "line abc" 打印 0。它不應該打印 99 嗎? 當我使用 for 循環打印所有矢量元素時,也會打印 99 但為什么 line abc 不這樣做? 我正在取消對迭代器 *it 的引用,並且我希望它能夠保存元素 99。

插入向量時,所有先前的迭代器都無效。 veclist.insert(it,20)之后的所有內容都是未定義的行為。

為了更准確地了解幕后發生的事情,第一次打印有效而第二次打印無效的原因是分配的std::vector容量。 大多數實現只分配 2^N memory塊。

因此,初始向量的容量為 4。當您將大小從 3 增加到 4 時,所有先前的迭代器恰好保持有效。 但是,當大小從 4 增長到 8 時,memory 被復制到一個新區域,因此您正在訪問已刪除的 memory。

為了解決這個問題,您可以簡單地使用std::vector::insert的結果作為指向插入元素的有效迭代器:

例如

it = veclist.insert(it,20);

因為std::vector<T,Allocator>::insert導致迭代器失效。

如果新的size()大於舊的capacity()則導致重新分配。 如果新的size()大於capacity() ,則所有迭代器和引用都無效。 否則,只有插入點之前的迭代器和引用保持有效。 過去的迭代器也無效。

這意味着在insert的調用之后, it已失效。 *itit++這樣的使用會導致 UB。

您應該將it分配給insert的返回值,它是指向插入值的迭代器。 例如

vector<int>::iterator it;
it=veclist.begin();
it=veclist.insert(it,20);
cout << *it << endl;  // prints 20 
it++;
it=veclist.insert(it,99);
cout << *it <<endl;   // prints 99

暫無
暫無

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

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