有人可以简明地解释一下set_union在c ++中是如何工作的吗?

时间:2013-02-26 04:01:05

标签: c++ algorithm

我对如何解释下一页中为set_union提供的代码感到困惑:http://www.cplusplus.com/reference/algorithm/set_union/

当函数返回时,算法如何确保结果保持两个集合的并集?例如,如果我们想要找到以下列表的set_union:

L1        L2

hi        goodbye
bye       hello
see       hi
two       bye
three     hooray

有人可以告诉我这个算法如何适用于这样的列表,假设我们的前后都有一个迭代器吗?

2 个答案:

答案 0 :(得分:3)

您缺少set_union工作的关键要求:您传入其中的两个范围必须排序。从您发布的链接:

  

set_union构造一个从result指向的位置开始的排序范围,其中包含两个排序范围[first1,last1)[first2,last2)的集合。

页面上显示的代码只是执行两个预先排序的序列的合并。

答案 1 :(得分:1)

关键信息是该算法假设元素在两个范围内都是有序的,因此在您的情况下它将是:

L1:  bye, hi, see, three, two
L2:  bye, goodbye, hello, hi, hooray

考虑到这一点,不难理解算法的作用。

虽然两个范围都包含元素,但是向联合添加迭代器指向的最小元素并推进迭代器。如果两个迭代器都引用相同的元素,添加它并推进两个迭代器(你不想插入两次)。

其中一个范围为空后,只需将其他范围内的所有剩余元素复制到解决方案中。

在这种情况下,插入bye并前进两个迭代器,插入goodbye并前进第二个迭代器,插入hello并前进第二个迭代器,插入hi并前进两个迭代器,插入hooray并前进第二个迭代器。现在第二个范围是空的,所以只需要完成第一个范围内的其余元素。