0

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ます。しかし、セットのすべての結合を取得しようとすると、うまくいきません! の最後の 5 つの値はfinalUnion住所フィールドだと思いますが、それらを削除するにはどうすればよいですか? また、ユニオン自体が間違っていて、その理由がわかりません。

4

2 に答える 2

1

Union操作は、2 つのセットに共通する値を削除します。

AUnionB には 8 つの要素があることに注意してください (コードで予測される 12 ではありません)。

2 つの初期共用体の実際のサイズを考慮して、共用体コードを調整する必要があります。これを正しく行うための準備はすべて整っています。

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

セット C には 8 の 2 つの異なる出現があり、セット D には 4 の 2 つの異なる出現があることに注意してください。

アップデート

また、私はあなたのコードを試してみましたが、答えは 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

于 2015-05-04T18:12:28.093 に答える