проблема set_union при использовании массивов

Я пытаюсь получить объединение 4 массивов, используя set_union. Вот код, который у меня есть:

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 поля адреса, но как их удалить? Кроме того, сам союз неверен, и я не могу понять, почему.

0

Решение

Размеры 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
1

Другие решения

союз Операция удаляет значения, которые объединяют два набора.

Обратите внимание, что 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) или в обоих. Общий случай более сложный, потому что входные диапазоны могут содержать повторяющиеся элементы. Обобщение заключается в том, что если значение появляется m раз в [first1, last1) и n раз в [first2, last2) (где m или n может быть нулем), то оно появляется max (m, n) раз в выходном диапазоне.

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

1

По вопросам рекламы [email protected]