2012-04-05 71 views
9

是否允許擦除迭代器指向的元素,並將同一迭代器前進一行以轉到下一個元素?C++設置迭代器的刪除

set<int>::iterator it = S.begin(); 
while (it != S.end()) { 
    if (shouldBeRemoved(*it)) { 
     S.erase(it++); // is this line valid? 
    } else { 
     ++it; 
    } 
} 

回答

5

是否允許刪除被迭代器指向一個元素,推進相同的迭代器在一行赴下一個元素?

是的,它是有效的。


理由:

it++增量it使得它指的是下一個元素但產生其 原始值的副本。因此,當調用erase()時,it不引用被刪除的元素。 而在std::set的情況下,只有擦除元素的迭代器纔會失效。 #1

您可以將此代碼示例作爲樣板代碼來刪除迭代器所引用的元素。


參考文獻:

對於std::set
#1C++ 03標準23.1.2/8:

只有迭代器和引用到擦除元素無效

2

是的,它是有效的。表達式it++在函數被調用之前完全評估,因此該函數接收到前一個值it,但在被移除(並失效)時,迭代器已經增加。