在迭代器时从 std::list 中删除条目
Remove an entry out of a std::list while iterator
当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);
}
}
在这里观看直播
相关文章:
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 使用容器中元素的别名删除带有 std::list::remove 的元素是否正确?
- 如何通过存储在 std::list 中的指针删除对象?
- 通过引用从 std::list 中删除元素
- 为什么具有 list<struct type>::itrator 的 struct 不能通过 clear() 删除?
- 将 std::list<std::unique_ptr> 移动到向量中会尝试引用已删除的函数
- 如何从 std::list 中删除元素?
- 从 std::list 中删除 std::tuple
- std::list - 删除元素
- 在迭代器时从 std::list 中删除条目
- 在C++中有条件地删除Singly Linked List中的元素
- 从 std::list 中删除对象
- 不应该像这样从 stl::list 中删除进入无限循环
- std::list remove_if删除节点
- 有效地从 std::list 中删除最后一个元素
- (C++) list.error 方法和使用指针删除内存
- std::list.remove 正在调用析构函数,但不删除它
- 迭代时从 std::list 中删除
- 如何正确删除 std::list 中的指针
- 正在从Singly Linked Circular List中删除特定节点