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