[英]Undefined behavior while using vectors (STL), Please explain the below code output behind reason
這可能與某些編譯器/ OS一起工作,而與其他編譯器/ OS一起崩潰。 與“列表”相同的代碼可以正常工作,而僅使用“向量”時,我面臨着未定義的行為輸出。 STL(向量)安全嗎?
注意:這不是實時代碼,我只是通過一些示例程序來完成。
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (vector<int>::iterator i = v.begin();
i != v.end(); i++) {
cout << *i << endl;
if (*i == 1) {
v.push_back(5);
}
}
}
向量輸出:1 0 3 4 0 0 4113 0 858851888 943206709 2617。 。 1 2 3 4 5 5
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (list<int>::iterator i = v.begin();
i != v.end(); i++) {
cout << *i << endl;
if (*i == 1) {
v.push_back(5);
}
}
}
輸出列表:1 2 3 4 5
循環中的行:
v.push_back(5);
可能會使迭代器i
無效(在需要重新分配的情況下),因此從那時起++i
就成為未定義的行為。
解決此問題的一種可能性是先保留向量,這樣就不會發生重新分配:
vector<int> v;
v.reserve(5); // reserve enough to keep all the pushed items
v.push_back(1);
...
您缺少的概念是“迭代器無效”。 std::vector
只是一個具有有限容量的動態數組。 當添加新元素導致數組大小大於容量時,需要進行重新分配,這會使向量的所有迭代器失效。 這在標准草案的“ 23.3.7.5矢量修飾符”部分中進行了定義,其中討論了insert
和push_back
:
備注:如果新大小大於舊容量,則導致重新分配。 如果沒有發生重新分配,則插入點之前的所有迭代器和引用均保持有效。
另一方面, std::list
是一個雙向鏈接列表。 因此,列表中已經存在的任何元素都不需要重新分配,只有std::list<T>::end()
迭代器無效。 但是,由於您是在循環條件下調用該方法,因此您的代碼恰好可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.