c++ - std::list 删除中的意外结果 (C++)

标签 c++ c++11

我在使用 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/

相关文章:

c++ - 获取合适的存储值类型?

c++ - 尝试将 curried lambda 与另一个 lambda 组合时出现意外结果

c++ - 为什么一元减去进行整数提升?

c++ - windows上的linux开发

c++ - 为什么当我试图返回一个 const 引用时会出现 vector 复制?

c++ - 我可以将智能指针推送到智能指针列表吗?

c++ - 自定义 UI 元素使用的智能指针选择

c++ - 在 C/C++ 中捕获 DLL 崩溃

c++ - 是否存在不应将 C4172 Visual C++ 警告视为错误的情况?

c++ - 特化模板 is_string