算法删除两组交集中的元素

Pau*_*ulH 5 c++ algorithm

我有一个Visual Studio 2008 C++ 03应用程序,我有两个标准容器.我想从一个容器中删除另一个容器中存在的所有项目(集合的交集).

这样的事情:

std::vector< int > items = /* 1, 2, 3, 4, 5, 6, 7 */;
std::set< int > items_to_remove = /* 2, 4, 5*/;

std::some_algorithm( items.begin, items.end(), items_to_remove.begin(), items_to_remove.end() );

assert( items == /* 1, 3, 6, 7 */ )
Run Code Online (Sandbox Code Playgroud)

是否存在可以执行此操作的现有算法或模式,还是需要自行编写?

谢谢

K-b*_*llo 6

试试:

items.erase(
    std::remove_if(
        items.begin(), items.end()
      , std::bind1st(
            std::mem_fun( &std::set< int >::count )
          , items_to_remove
        )
    )
  , items.end()
);
Run Code Online (Sandbox Code Playgroud)

std::remove(_if)实际上并没有删除任何东西,因为它适用于迭代器而不是容器.它的作用是在范围的末尾重新排序要删除的元素,并将迭代器返回到容器的新端.然后erase,您调用实际从容器中删除新结束之后的所有元素.

更新:如果我没记错的话,绑定到标准库组件的成员函数不是标准C++,因为允许实现向函数添加默认参数.通过创建自己的函数或函数对象谓词来检查元素是否包含在要删除的项集中,您会更安全.

  • 这就是为什么它不是答案:-) (2认同)