set_union与multiset容器?

时间:2010-07-07 14:56:32

标签: c++ stl containers stl-algorithm

当一个或两个输入容器是具有重复对象的多个集合时,算法std:set_union的返回是什么?重复会丢失吗?

我们假设例如:

multiset<int> ms1;
ms1.insert(1);
ms1.insert(1);
ms1.insert(1);
ms1.insert(2);
ms1.insert(3);

multiset<int> ms2;
ms2.insert(1);
ms2.insert(1);
ms2.insert(2);
ms2.insert(2);
ms2.insert(4);

vector<int> v(10);
set_union( ms1.begin(), ms1.end(), ms2.begin(), ms2.end(), v.begin() );

输出是什么?

3 个答案:

答案 0 :(得分:4)

从标准,25.3.5:

  

通过定义union()以包含每个元素的最大出现次数,intersection()包含最小值,等等,将集合操作的语义一般化为多个集合。< / p>

所以在你的例子中,结果将是(1,1,1,2,2,3,4,0,0,0),因为你初始化了长度为10的向量。

答案 1 :(得分:2)

来自documentation of std::set_union(强调添加)。

  

在最简单的情况下,set_union从set theory执行“union”操作:输出范围包含[first1,last1],[first2,last2]或两者中包含的每个元素的副本。 一般情况更复杂,因为输入范围可能包含重复元素。一般化是如果一个值在[first1,last1]中出现m次并且在[first2,last2]中出现n次(其中m或n可能为零),则它在输出范围中出现max(m,n)次。 [1] Set_union是稳定的,意味着保留每个输入范围内元素的相对顺序,并且如果两个输入范围中都存在元素,则从第一个范围而不是第二个范围复制它。 / p>

max(m,n)mms1nms2次{{1}}次{{1}}次{{1}}

答案 2 :(得分:2)

来自C ++标准,§25.3.5/ 1:

  

此部分定义排序结构上的所有基本集合操作。它们还适用于包含多个等效元素副本的多集(23.3.4)。 set操作的语义通过定义union()来包含每个元素的最大出现次数,包含最小值的intersection()等等,以标准方式推广到多个集合。