是否允許擦除迭代器指向的元素,並將同一迭代器前進一行以轉到下一個元素?C++設置迭代器的刪除
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
是否允許擦除迭代器指向的元素,並將同一迭代器前進一行以轉到下一個元素?C++設置迭代器的刪除
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
是否允許刪除被迭代器指向一個元素,推進相同的迭代器在一行赴下一個元素?
是的,它是有效的。
理由:
it++
增量it
使得它指的是下一個元素但產生其 原始值的副本。因此,當調用erase()
時,it
不引用被刪除的元素。 而在std::set
的情況下,只有擦除元素的迭代器纔會失效。 #1
您可以將此代碼示例作爲樣板代碼來刪除迭代器所引用的元素。
參考文獻:
對於std::set
,
#1C++ 03標準23.1.2/8:
只有迭代器和引用到擦除元素無效
是的,它是有效的。表達式it++
在函數被調用之前完全評估,因此該函數接收到前一個值it
,但在被移除(並失效)時,迭代器已經增加。