好的,我希望我在这里犯了一个愚蠢的错误。我有一个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/