2008-10-02 36 views
1

目前我試圖從一組中刪除一系列迭代器,但是GCC的標準庫似乎被破壞,因爲std :: set :: erase(iterator)應該返回一個迭代器(下一個迭代器),但是在GCC中它返回void(這是標準?)當使用它作爲參數時,增加一個迭代器是否安全?

反正我想寫:

myIter = mySet.erase(myIter); 

但是GCC不喜歡它... ... 因此它是安全的,而不是寫這個?

mySet.erase(myIter++); 

謝謝!

編輯:是的,我正在檢查mySet.end();

回答

9

沒有與

mySet.erase(myIter++); 

沒有問題的操作的順序是明確的:myIter被複制到myTempIter,myIter遞增,然後myTempIter被提供給擦除方法。

對於Greg和Mark:不,操作員++在擦除調用後無法執行操作。根據定義,erase()在operator ++返回後調用。

+0

你說的只是因爲操作符++已被類重新定義。對於POD,操作員實際上是在線後呼叫的! – PierreBdR 2008-10-02 08:05:50

+0

是的,這是一個有趣的評論。關鍵在於操作順序與POD類型無關,因爲增量總是定義明確的。 那麼你總是可以想象奇怪的情況下,方法有一些訪問POD變量的引用,但這不被推薦。 – Camille 2008-10-02 08:32:47

3

首先,重讀的標準,你會看到一組::擦除方法的原型爲:

void erase(iterator position); 

然而,在STL關聯容器是「穩定的」擦除元素不要影響其他元素上的迭代器。這意味着下列行是有效的:

iterator to_erase = myIter++; 
mySet.erase(to_erase); 
// Now myIter is still on the next element 
相關問題