相关疑难解决方法(0)

std :: remove_if - lambda,不从集合中删除任何东西

好吧,我希望我在这里犯了一个愚蠢的错误.我有一个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; 
   }
  ); 
Run Code Online (Sandbox Code Playgroud)

即使出6名DisplayMode3d在MyDisplayDevices,只有1个有什么DisplayMode3d的其模式集合中,没有被从列表中删除.

我在这里犯了什么错误?

编辑:

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

MyDisplayDevices.remove_if( [](DisplayDevice3d const & device) 
                            { 
                                return device.Modes.size() == 0; 
                            });
Run Code Online (Sandbox Code Playgroud)

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

43
推荐指数
3
解决办法
3万
查看次数

如何在没有临时设置的s1中存储设置差异s1-s2?

STL是否已经包含任何简单的方法或算法来存储集合之间的差异set1set2直接存在set1,而不需要临时的集合变量?

下面的示例代码显示了我已经尝试过的一些替代方案(哪些方法无效)以及带有临时设置的解决方案tmp(我想避免):

int _tmain(int argc, _TCHAR* argv[])
{
    std::set<int> set1, set2;

    set1.insert(1); set1.insert(2); set1.insert(3); set1.insert(4); set1.insert(5);
    set2.insert(4); set2.insert(6);

    // NONE OF THE FOLLOWING ALTERNATIVES DID WORK:
    // a: // set1.erase(set2.end(), set2.begin());
    // b: // std::set_difference(set1.begin(), set1.end(), 
    //                set2.begin(), set2.end(), set1.begin());
    // c: // std::remove_if(set1.begin(), set1.end(), 
    //                [set2](int i){return set2.find(i) != set2.end();} );

    // Complicated version, for which I am trying to find something simpler:
    std::set<int> tmp;
    std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(tmp, tmp.end())); …
Run Code Online (Sandbox Code Playgroud)

c++ stl set

5
推荐指数
1
解决办法
210
查看次数

标签 统计

c++ ×2

c++11 ×1

erase-remove-idiom ×1

lambda ×1

remove-if ×1

set ×1

stl ×1