簡體   English   中英

為什么不能刪除向量中的元素?

[英]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.

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