[英]Is it safe to use std::vector.erase(begin(), end()) or std::vector.erase(begin(), begin())?
我想在一段時間內處理一個向量中的元素。 為了優化這一點,我不想在處理項目時刪除它,並在最后刪除所有已處理的項目。
vector<Item*>::iterator it;
for(it = items.begin(); it != items.end(); ++it)
{
DoSomething(*it);
if(TimeIsUp())
{
break;
}
}
items.erase(items.begin(), it);
在it == items.end()
時使用擦除是否安全? 在文檔中,據說erase()
將擦除[first,last],這應該是安全的,但我想確定。
編輯:
使用std :: vector.erase(begin(),begin())是否安全?
是的,這是正確的 - 這是符號[first, last)
意思, end()
指向一個結尾。
回答你的編輯:是的,那也沒關系。 vec.erase(q1,q2)
定義為擦除“ [q1, q2)
范圍內的元素”。 這兩個論點都是一樣的。 [q1, q2)
被定義為const迭代器的有效范圍。 如果有一系列增量可以對q1
進行到q2
,則認為范圍是有效的 - 在這種情況下,序列沒有增量。 實際上,該標准專門定義了一個空范圍:
范圍
[i,i)
是空范圍
[first,last)
意味着什么是first
和last
之間的一切,包括first
但不包括last
。 它表示半開集。 如果他們使用[first,last]
,也會包含last
; 如果他們使用(first,last)
, first
和last
將被排除在外。
您的代碼存在問題。 你想在元素it
被刪除,如果it
不等於end()
你應該使用而不是items.erase (items.begin(),it)
if (it != items.end()) {
items.erase (items.begin(), it+1);
}
else {
items.clear(); // same as items.erase (items.begin(), items.end())
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.