我对如何解释下一页中为set_union提供的代码感到困惑:http://www.cplusplus.com/reference/algorithm/set_union/
当函数返回时,算法如何确保结果保持两个集合的并集?例如,如果我们想要找到以下列表的set_union:
L1 L2
hi goodbye
bye hello
see hi
two bye
three hooray
有人可以告诉我这个算法如何适用于这样的列表,假设我们的前后都有一个迭代器吗?
答案 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
并前进第二个迭代器。现在第二个范围是空的,所以只需要完成第一个范围内的其余元素。