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

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

最佳答案

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

  • 如果两个元素中都包含指向的元素,则同时增加
  • 否则,如果A的迭代器指向的元素较小,则将其生成为A \ B,然后增加A的迭代器。
  • else,将产生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;
    }
    

    关于c++ - 一次计算两个设定差A\B和B\A,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34618672/

    10-09 06:37