0

我对如何解释以下页面中为 set_union 给出的代码感到困惑:http ://www.cplusplus.com/reference/algorithm/set_union/

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

L1        L2

hi        goodbye
bye       hello
see       hi
two       bye
three     hooray

假设我们在每个列表的前面和后面都有一个迭代器,有人可以告诉我算法是如何处理这样的列表的吗?

4

2 回答 2

3

您缺少set_union工作的关键要求:您传递给它的两个范围都必须是sorted。从您发布的链接:

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

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

于 2013-02-26T04:05:11.800 回答
1

关键信息是该算法假定元素在两个范围内排序作为先决条件,因此在您的情况下它将是:

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

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

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

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

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

于 2013-02-26T04:03:29.733 回答