2013-02-26 45 views
0

我很困惑如何解釋set_union給出的代碼在下面的頁面:http://www.cplusplus.com/reference/algorithm/set_union/有人可以簡潔地解釋set_union如何在C++中工作嗎?

算法如何確保結果在函數返回時保持兩個集合的聯合?例如,如果我們想找到下面列出的set_union:

L1  L2 

hi  goodbye 
bye  hello 
see  hi 
two  bye 
three  hooray 

有人能走我走過的算法如何工作的這樣的列表,假設我們有一個迭代器前,每個回來嗎?

+4

您的兩個範圍沒有排序,這是「設置」算法所要求的。 – congusbongus 2013-02-26 04:02:50

回答

1

的關鍵信息是,該算法假設爲前提的元素在兩個範圍排序,所以你的情況這將是:

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

考慮到這一點是不難遵循算法的作用。

儘管這兩個範圍都包含元素,但向迭代器指向的元素中最小的元素添加到聯合並推進該迭代器。如果兩個迭代器都引用相同的元素,那麼添加它並推進兩個迭代器(不要插入兩次)。

其中一個範圍爲空後,只需將其他範圍內的所有剩餘元素複製到解決方案。

在這種情況下,插入bye和推進兩個迭代器,插入goodbye和超前的第二迭代器,插入hello和超前的第二迭代器,插入hi和推進兩個迭代器,插入hooray和推動第二迭代器。現在第二個範圍是空的,所以只需完成第一個範圍的其餘元素即可。

3

您缺少set_union工作的關鍵要求:您傳遞給它的兩個範圍必須爲排序的。從您發佈的鏈接:

set_union構造一個有序區間開始由結果與兩個的並集指向的位置排序範圍[first1,last1)[first2,last2)

頁面上顯示的代碼只是執行兩個預排序序列的合併。