(通常)删除集合交叉点的最快方法

时间:2013-06-19 02:44:11

标签: c++ stl set

我有两套testtest1,我需要删除test中存在的test1元素,例如

如果test包含1,2,3,4,5且test1包含3,5,6,7:则该函数应在test上执行,因此只有1,剩下2,4。

我发现set_intersection - 这是最好的做事方式吗?

编辑:道歉。 testtest1都是set<int>

2 个答案:

答案 0 :(得分:3)

这应该有效。我没有测试过它。 您可以使用:

set_difference(test.begin(), test.end(),test1.begin(),test1.end(),std::inserter(test, test.end()));

答案 1 :(得分:0)

set没有非const迭代器。使用list和remove_if。

#include <iostream>
#include <list>
#include <algorithm>

int
main(int argc, char* argv[]) {
  std::list<int> test = {1,2,3,4,5};
  std::list<int> test1 = {3,5,6,7};

  std::list<int>::iterator ri = std::remove_if(test.begin(), test.end(), [&](int x) -> bool {
    return std::find(test1.begin(), test1.end(), x) != test1.end();
  });
  test.erase(ri, test.end());
  std::for_each(test.begin(), test.end(), [&](decltype(test)::value_type x) {
    std::cout << x << std::endl;
  });
  return 0;
}