【问题标题】:C++: how to strip a "set" by removing multiple elements?C ++:如何通过删除多个元素来剥离“集合”?
【发布时间】:2017-04-20 07:08:48
【问题描述】:

在 STL 算法中,有几个“集合”操作,如 set_union、set_difference、set_intersection、set_symmetric_difference,但我希望在 2 个向量之间进行:

vector<int> A={1,2,3,4};
vector<int> B={1,3};

我希望得到 A-B,所以 A-B={2,4}。

有没有方便的方法来做这个“减号”? 谢谢!

【问题讨论】:

  • 听起来像std::set_difference,不是吗?你已经提到它了,那你为什么不认为你可以使用它呢?它只需要对您的vectors 进行排序,您的也是。
  • 哦,我想我明白了:你认为你只能在 std::set 上使用 set_ 算法吗?不对。标准库中的容器和算法不直接交互,而是通过迭代器,因此算法不需要关心它们操作的容器的确切类型。如果您还希望结果进入vector,请使用back_inserter 为算法创建输出迭代器。

标签: c++ algorithm function stl set


【解决方案1】:

只要对vector 进行排序,您绝对可以在vector 上使用set_ 算法。然后您可以使用back_inserter() 将输出推送到另一个vector

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
    std::vector<int> v1 {1, 2, 3, 4};
    std::vector<int> v2 {1, 3};
    std::vector<int> out;
    std::set_difference(std::begin(v1), std::end(v1), // the first vector...
                        std::begin(v2), std::end(v2), // ...minus the second...
                        std::back_inserter(out));     // ...is stored into here
    for(auto i : out) std::cout << i << ' ';
}

打印:

2 4

(请注意,此版本假定它可以使用 &lt; 比较元素,并且元素是相对于该元素进行排序的 - 这在您的情况下显然没问题)。

【讨论】:

  • 但是你不能在std::unordered_set上使用设置算法,这有时会让人感到困惑。
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2017-12-16
相关资源
最近更新 更多