【问题标题】:C++ List Iteration and erasing [duplicate]C ++列表迭代和擦除[重复]
【发布时间】:2017-07-18 09:44:48
【问题描述】:

编辑:这个问题专门指 std::lists - Stack Overflow 上的其他类似问题指的是 std::vectors

我正在使用 C++,并且在迭代它时无法从 std::list 中擦除一个元素。我有一个自定义类的列表(为了这个问题,“对象”),我的代码如下所示:

for(auto i : Objects)
    if(i.EraseFlag == true)
        {
            i = Objects.erase(i);
        }

我收到错误:'没有匹配的函数调用 std::list::erase(Object&)'

我相信这是迭代列表、擦除元素并返回考虑擦除的迭代器的正确方法(从 C++11 开始),但显然我做错了什么。以前在使用向量时,我会使用“Objects.erase(Objects.begin() + i)”,其中 i 是 for 循环中的整数,但考虑到列表的访问要求,这将不起作用。

帮助表示赞赏。

谢谢

【问题讨论】:

  • erase() 以迭代器为参数
  • 您不应在基于范围的for 循环期间更改序列。
  • 我相信这是迭代列表、擦除元素并返回考虑擦除的迭代器的正确方法(从 C++11 开始), - - 当你可以使用erase / remove idiom 来执行此操作时,为什么要删除这样的内容,而无需循环?
  • 看,no loops
  • 感谢@PaulMcKenzie,remove_if 看起来是解决这个问题的正确方法 - 我已经尝试使用你的代码,但我现在收到“无效使用自动”错误 - 有什么想法吗?

标签: c++ list c++11 erase


【解决方案1】:

成员函数erase 处理迭代器。

对于这样的任务,使用普通的 for 循环是正确的。例如

for ( auto it = Objects.begin(); it != Objects.end(); )
{
    if ( it->EraseFlag ) it = Objects.erase( it );
    else ++it;
}

另一种方法是使用成员函数remove_if。例如

Objects.remove_if( []( const auto &value ) { return value.EraseFlag; } );

【讨论】:

  • 感谢弗拉德,您的初始循环似乎有效。看起来使用 remove_if 将是执行此操作的最佳实践方式,您也已将其包括在内,因此我将其标记为答案
  • @nathanburns 完全没有。不客气。
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 2018-09-04
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2011-09-23
  • 2023-03-23
相关资源
最近更新 更多