在迭代器时从 std::list 中删除条目

Remove an entry out of a std::list while iterator

本文关键字:删除 list std 迭代器      更新时间:2023-10-16

std::list满足条件时,我正在尝试删除列表中的元素。我在参考中读到的关于erase函数的返回值:

指向最后一个元素后面的元素的迭代器 被函数调用擦除。这是容器结束,如果 操作擦除了序列中的最后一个元素。

成员类型迭代

器是一种双向迭代器类型,指向 元素。

我把这个例子放在一起:

#include <string>
#include <list>
#include <iostream>
int main()
{
        typedef std::list<std::string> string_list_t;
        string_list_t list;
        list.push_back("test1");
        list.push_back("test2");
        list.push_back("test3");
        list.push_back("test4");
        list.push_back("test5");
        list.push_back("test6");
        list.push_back("test7");
        list.push_back("test8");
        for (string_list_t::iterator it = list.begin(); it != list.end(); ++it)
        {
                std::string &str = *it;
                std::cout << "Checking " << str << "..." << std::endl;
                if (str == "test4")
                {
                        std::cout << "Found test4!" << std::endl;
                }
                else
                {
                        it = list.erase(it);
                }
        }

    return 0;
}

它没有给我预期的输出,而是给了我:

Checking test1...
Checking test3...
Checking test5...
Checking test7...

有人可以帮助我弄清楚我理解错了什么吗?不知何故,它跳过了每隔一个元素...

您将跳过已删除元素之后的元素。

您应该使用 it = list.erase(it); ++it ,但不能同时使用两者。

std::list中删除元素时,不要递增 std::list::erase 方法返回的迭代器。您不仅会跳过下一个元素,最终可能会增加end()迭代器。

将循环更改为:

for (string_list_t::iterator it = list.begin(); it != list.end(); )
                                                                //^^ Not incremented
        {
                std::string &str = *it;
                std::cout << "Checking " << str << "..." << std::endl;
                if (str == "test4")
                {
                        std::cout << "Found test4!" << std::endl;
                        ++it;           //increment
                }
                else
                {
                        it = list.erase(it);
                }
        }

在这里观看直播