我在使用 std::list 时遇到一些奇怪的行为。问题是,当我删除列表中的当前元素时,它会使该元素无效。当我使用 for( auto& iter : list) 循环遍历元素时,它卡在应该删除的元素上。我有一个最小的可编译示例来展示这一点:
#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版本5.3.0(x86_64-posix-sjlj-rev0,由MinGW-W64项目构建)
我很好奇我是否错误地认为这应该按我的预期工作。
最诚挚的问候,
最佳答案
来自http://en.cppreference.com/w/cpp/container/list/erase :
References and iterators to the erased elements are invalidated.
基于范围的 for 循环使用隐式迭代器。 remove
正在删除迭代器指向的元素,因此它变得无效,并且您有未定义的行为,并且它可能会删除您的硬盘驱动器。
相反,获取一个显式迭代器。调用erase
,而不是remove
,并将迭代器设置为erase
的返回值继续迭代(返回值:“跟随最后一个删除的迭代器元素。”)
关于c++ - std::list 删除中的意外结果 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37768572/