c++ - std::remove_if - lambda,不从集合中删除任何内容

标签 c++ c++11 lambda remove-if erase-remove-idiom

好吧,我想我在这里犯了一个愚蠢的错误。我有一个 DisplayDevice3d 列表,每个 DisplayDevice3d 都包含一个 DisplayMode3d 列表。我想从 DisplayDevice3d 列表中删除没有任何 DisplayMode3d 的所有项目。我正在尝试使用 Lambda 来执行此操作,即:

    // If the device doesn't have any modes, remove it.

  std::remove_if(MyDisplayDevices.begin(), MyDisplayDevices.end(),
   [](DisplayDevice3d& device) 
   { 
    return device.Modes.size() == 0; 
   }
  ); 

即使在 MyDisplayDevices 中的 6 个 DisplayMode3d 中,只有 1 个在其 Modes 集合中有任何 DisplayMode3d,但没有从列表中删除任何内容。

我在这里犯了什么重大错误?

编辑:

好吧,我的错误是我应该使用 MyDisplayDevices.remove_if 而不是 std::remove_if,但是下面的答案对于使用 std::remove_if 是正确的:p。

MyDisplayDevices.remove_if( [](DisplayDevice3d const & device) 
                            { 
                                return device.Modes.size() == 0; 
                            });

最佳答案

你需要在remove_if返回的迭代器上调用erase,它应该看起来像这样:

auto new_end = std::remove_if(MyDisplayDevices.begin(), MyDisplayDevices.end(),
                              [](const DisplayDevice3d& device)
                              { return device.Modes.size() == 0; });

MyDisplayDevices.erase(new_end, MyDisplayDevices.end());

关于c++ - std::remove_if - lambda,不从集合中删除任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4478636/

相关文章:

c++ - 通过调用对象获取对象数据

c++ - 带有 std::thread 和 this 的 ctor 初始值设定项列表

c# - 使用 Expression 类构造 LINQ 表达式时按正则表达式搜索

node.js - 为 NodeJS Lambda 函数重用 Redis 连接

c++ - 将大量数据从 FORTRAN 传递到 C++

c++ - 如何强制指针在每次启动时不保持它们的值和顺序?

c++ - arm-linux libstdc++ 调试和发布的区别

c++ - 如何将函数应用于可变列表的每个组件并返回可变列表?

C++ std::ios_base::failure 异常

Python 通过多个键使用 lambda 排序列表或字典