c++ std::set的并集运算[重复]

yjghlzjz  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(178)
    • 此问题在此处已有答案**:

Merge multiple sets elements in a single set(4个答案)
append set to another set(2个答案)
八年前就关门了。
标准库中没有这样的函数吗?

set<T> set::union(set<T> other)

或者这个?

set<T> getUnion(set<T> a, set<T> b)

set_union只是名称上正确的函数,它也可以在vector上操作,这意味着它可能没有set-only函数那么高效。
我**没有追加。* 追加会破坏原始集合 。我需要一个表示并集的 * 新 * 集合。*

7tofc5zh

7tofc5zh1#

你可以使用两个迭代器std::set::insert模板:

template <typename T>
std::set<T> getUnion(const std::set<T>& a, const std::set<T>& b)
{
  std::set<T> result = a;
  result.insert(b.begin(), b.end());
  return result;
}

注意:由于我需要一个副本,所以一些评论建议我按值获取其中一个参数,我选择此实现以避免禁用RVO,这在返回按值获取的参数时是不允许的。为了更好地处理右值参数,可以提供此函数的重载,该函数采用右值引用并利用移动语义。

t98cgbkg

t98cgbkg2#

std::set_union
该页的示例使用了向量和数组,因此用途非常广泛:

// set_union example
#include <iostream>     // std::cout
#include <algorithm>    // std::set_union, std::sort
#include <vector>       // std::vector

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  std::vector<int> v(10);                      // 0  0  0  0  0  0  0  0  0  0
  std::vector<int>::iterator it;

  std::sort (first,first+5);     //  5 10 15 20 25
  std::sort (second,second+5);   // 10 20 30 40 50

  it=std::set_union (first, first+5, second, second+5, v.begin());
                                               // 5 10 15 20 25 30 40 50  0  0
  v.resize(it-v.begin());                      // 5 10 15 20 25 30 40 50

  std::cout << "The union has " << (v.size()) << " elements:\n";
  for (it=v.begin(); it!=v.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出:

The union has 8 elements:
 5 10 15 20 25 30 40 50

相关问题