在一次通过中计算两个设置差异A \ B和B \ A.

时间:2016-01-05 18:23:13

标签: c++ algorithm

如果我有一个表示为排序范围的集合,我可以使用std::set_difference计算A\Bstd::set_symmetric_difference来计算A\B U B\A。如果我要同时计算不同的集A\BB\A,该怎么办?

当然,我可以运行std::set_difference两次,但这似乎并不优雅(如果我们有输入迭代器,甚至不可能)。编写我自己的实现也很容易,但我想知道这个任务是否有现成的解决方案?

1 个答案:

答案 0 :(得分:2)

如果您的集合都已排序,则可以使用两个迭代器一次完成:

  • 如果指向的元素在两个集合中,请同时增加
  • 如果A迭代器指向的元素较小,则将其生成为A \ B,并增加A的迭代器。
  • 否则,将产生B的元素增加到B \ A并增加B的迭代器。

像伪代码一样的C ++:

iter1 = A.begin();
iter2 = B.begin();
while (iter1 != A.end() && iter2 != B.end()) { 
  if (*iter1 == *iter2) { 
    // don't produce anything
    ++iter1; ++iter2;
  } else if (*iter1 < *iter2) { 
    // produce *iter1 to A\B
    ++iter1;
  } else { 
    //produce *iter2 to B\A
    ++iter2;
  }
}

while (iter1 != A.end()) {
  //produce element to A\B
  ++iter1;
}
while (iter2 != B.end()) {
  //produce element to B\A
  ++iter2;
}