好的,我希望我在这里犯了一个愚蠢的错误。我有一个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返回的迭代器上调用擦除,它看起来应该像这样:

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/

10-13 08:19