我遇到了一些奇怪的行爲,使用了std :: list。問題是,當我刪除列表中的當前元素時,它會使該元素無效。當我瀏覽具有for(auto& iter : list)
循環的元素時,它會卡在應該刪除的元素上。我有一個最小的可編譯的例子來說明這一點:在std :: list中刪除不需要的結果(C++)
#include <iostream>
#include <list>
#include <memory>
int main() {
std::list<unsigned int> wholeNumbers;
while(wholeNumbers.size() < 20) {
wholeNumbers.push_back(wholeNumbers.size());
}
for(auto wholeNumber : wholeNumbers) {
std::cout << "Deleting entries. Value is: " << wholeNumber << std::endl;
std::cout << "Old size: " << wholeNumbers.size() << std::endl;
wholeNumbers.remove(wholeNumber);
std::cout << "New size: " << wholeNumbers.size() << std::endl;
}
}
的這個期望的結果是,以噴出出遞增值和遞減的尺寸。但是,我正在經歷的結果如下:
Deleting entries. Value is: 0
Old size: 20
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 1901208
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 1901208
Old size: 19
New size: 19
然後,這會重複無限期。
我的編譯器的信息是:gcc version 5.3.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
我很好奇,如果我是相信這應該工作,我打算錯了。
最好的問候,
你正在使你的迭代器失效。 – erip
啊。看到你的評論,它終於被提了出來。當我刪除它時,它變成無效,並且不能移動到下一個,因爲指針不再在元素中退出。因此,刪除元素應該在'remove_if'語句中完成,而不是在'for'循環中。謝謝。 –
Spot on。好的結論! – erip