2012-12-17 46 views
4

我想在一段時間內處理矢量元素。爲了優化這一點,我不想在處理它時刪除一個項目,並在最後刪除所有處理的項目。使用std :: vector.erase(begin(),end())或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(開始(),()開始)?

+2

我強烈建議不要使用普通指針的'VECTOR'。要麼使用專門設計用於容納指針的容器,要麼使用智能指針的「向量」。 (可能的例外是,如果向量不擁有它指向的對象。) –

+1

@Cristy廢話。 –

+0

@DavidSchwartz同意。 – johnathon

回答

1

這也就意味着[first,last)firstlast,包括first但不包括last之間的一切。它表示一個半開放的集合。如果他們使用[first,last],則還將包括last;如果他們使用(first,last),firstlast將被排除在外。

您的代碼存在問題。如果it不等於end(),您想要刪除it處的元素。取而代之的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()) 
} 
5

是的,這是正確的 - 這就是標記[first, last)意味着和end()指向一個結束。

3

要回答你的編輯:是的,也沒關係。 vec.erase(q1,q2)被定義爲擦除「[q1, q2)範圍內的元素」。在這裏,兩個參數都是一樣的。 [q1, q2)被定義爲常量迭代器的有效範圍。如果您可以對q1執行一系列遞增操作,則範圍被認爲是有效的,以便到達q2 - 在這種情況下,序列沒有增量。實際上,標準特別定義了一個空的範圍:

甲範圍[i,i)是一個空的範圍

相關問題