[英]Why can't I delete an element in my vector?
我正在研究一個相當長的程序,並且很難從向量中刪除一個元素。 我試圖用一個非常簡單的向量來做到這一點,並且遇到了同樣的問題。 據我所知,我這樣做的方式與每個人在其他人的問題中的解釋相同。 這是簡單的代碼。
vector<int> vect;
vect.push_back(3);
vect.push_back(2);
cout << vect[1]; // prints '2'
vect.erase(vect.begin()+1);
cout << vect[1] << endl; // prints '2'
我究竟做錯了什么?
上面的代碼似乎可行,因為我在末尾檢查了大小,並打印了“ 1”。 真正的代碼不是:
size = A[i]->B().size();
cout << "size is " << A[i]->B().size() << endl; // prints 21
A[i]->B().erase(A[i]->B().begin()+size);
cout << "size now " << A[i]->B().size() << endl; // prints 21
我看不到自己做了什么不同的事情? A是一個向量,它存儲其他向量。 我想刪除B向量中的最后一個元素。
刪除元素后,向量的大小將變為1(因為在擦除前為2),實際上使表達式vect[1]
導致行為未定義,因為不再有索引為1
元素。 只剩下一個元素(值= 3,索引= 0)。 如果使用vect.at(1)
而不是vect[1]
,則會拋出std::out_of_range
。
編輯后:請記住,如果大小為N
,則N
不是向量的有效索引!!! 這些元素的索引為0, 1, 2, ... N-1
。 所以的確,大小是1
,因此唯一的有效索引是0
您正在執行的操作是未定義的行為 。 基本上,您訪問的是向量的當前最后一個元素,而您恰巧發現了留在此處的垃圾。 由於使用at
內置了范圍檢查功能at
因此使用at
而不是[]
來訪問元素變得很明顯。
// cout << vect[1] << endl;
cout << vect.at(1) << '\n';
如果at
上述位置用[]
替換[]
,則將收到std::out_of_range
異常,表明您提供的索引無效。
要刪除向量中的最后一個.pop_back()
,可以使用.pop_back()
。 您還應該注意,將整數添加到迭代器是個壞主意。 使用vector<int>::iterator
作為要添加的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.