[英]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
已失效。 像*it
或it++
這樣的使用會導致 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.