簡體   English   中英

使用數組時出現set_union問題

[英]set_union issue while using arrays

我試圖使用set_union獲得4個數組的並集。 這是我到目前為止的代碼:

int setA[5] = {2, 4, 5, 7, 8};
int setB[7] = {1, 2, 3, 4, 5, 6, 7};
int setC[5] = {2, 5, 8, 8, 15};
int setD[6] = {1, 4, 4, 6, 7, 12};

int AunionB[12];
int CunionD[11];
int finalUnion[23];

int *lastAunionB;
int *lastCunionD;

ostream_iterator<int> screen(cout, " ");

lastAunionB = set_union(setA, setA+5, setB, setB+7, AunionB);

cout << "AunionB = ";
copy(AunionB, lastAunionB, screen);
cout << endl;

lastCunionD = set_union(setC, setC+5, setD, setD+6, CunionD);

cout << "CunionD = ";
copy(CunionD, lastCunionD, screen);
cout << endl;

set_union(AunionB, AunionB+12, CunionD, CunionD+11, finalUnion);

cout << "Final Union = ";
copy(finalUnion, finalUnion+23, screen);
cout << endl;

運行代碼時,得到以下輸出:

AunionB = 1 2 3 4 5 6 7 8 
CunionD = 1 2 4 4 5 6 7 8 8 12 15 
Final Union = 1 2 3 4 5 6 7 2 4 4 5 6 7 8 8 12 15 52187240 1 1863041424 32767 0 0 

因此, setA and setB並集與setC and setD並集按預期工作。 但是,當我嘗試為集合獲取所有的並集時,它不起作用! 我猜測finalUnion的最后5個值是地址字段,但是如何刪除它們? 而且,工會本身是不正確的,我不明白為什么。

Union操作將刪除這兩個集合共有的值。

請注意,AUnionB具有8個元素(而不是您的代碼預測的12個元素)。

您需要調整您的工會聯合會代碼,以解決兩個初始工會的實際規模。 您已准備好正確執行所有操作:

int *lastFinalUnion = set_union(AunionB, lastAunionB, CunionD, lastCunionD, finalUnion);

注意,集合C有兩個不同的出現8,集合D有兩個不同的出現4,這就是為什么它們在中間結果中看起來是重復的。

更新

另外,我嘗試了您的代碼,得到的答案為1 2 3 4 5 6 7 2 4 4 5 6 7 8 8 12 15。 答案不應該是1 2 3 4 4 5 6 7 8 8 12 15

我相信您是正確的,但是我不在C ++編譯器的前面單步執行,以查看正在執行的操作或驗證您的輸出。 實際的代碼是由另一個SO成員編輯的,但是對我來說似乎是正確的。

在最簡單的情況下,set_union根據集合論執行“聯合”操作:輸出范圍包含[first1,last1),[first2,last2)或兩者中包含的每個元素的副本。 一般情況更加復雜,因為輸入范圍可能包含重復的元素。 通用性是,如果值在[first1,last1)中出現m次,在[first2,last2)中出現n次(其中m或n可以為零),則在輸出范圍中出現max(m,n)次。

https://www.sgi.com/tech/stl/set_union.html

AunionB和Cuniond的大小不是12和11,因為:

第二個范圍中的元素在第一個范圍中具有等效元素的元素不會復制到結果范圍。

試試這個代碼:

int setA[5] = { 2, 4, 5, 7, 8 };
int setB[7] = { 1, 2, 3, 4, 5, 6, 7 };
int setC[5] = { 2, 5, 8, 8, 15 };
int setD[6] = { 1, 4, 4, 6, 7, 12 };

int AunionB[12];
int CunionD[11];
int finalUnion[23];

int *lastAunionB;
int *lastCunionD;

ostream_iterator<int> screen(cout, " ");

lastAunionB = set_union(setA, setA + 5, setB, setB + 7, AunionB);

cout << "AunionB = ";
copy(AunionB, lastAunionB, screen);
cout << endl;

lastCunionD = set_union(setC, setC + 5, setD, setD + 6, CunionD);

cout << "CunionD = ";
copy(CunionD, lastCunionD, screen);
cout << endl;

int *finalUnionEnd;
finalUnionEnd = set_union(AunionB, lastAunionB, CunionD, lastCunionD, finalUnion);

cout << "Final Union = ";
copy(finalUnion, finalUnionEnd, screen);
cout << endl;

然后您得到了正確的結果:

Final Union = 1 2 3 4 4 5 6 7 8 8 12 15

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM