Если в двух массивах есть общие элементы, set_union
всегда брать эти общие элементы из первого массива? Из приведенного ниже фрагмента кода видно, что он всегда выбирает общие элементы из первого массива, но гарантировано ли это? Как это сделать, чтобы выбрать со второго.
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
struct Foo
{
Foo(int i, const std::string& n): id(i), name(n){}
int id;
std::string name;
};
bool comp(const Foo& first, const Foo& second)
{
return first.id < second.id;
}
int main()
{
Foo foo5A(5, "A");
Foo foo10A(10, "A");
Foo foo15A(15, "A");
Foo foo20A(20, "A");
Foo foo25A(25, "A");
Foo fooA[] = {foo5A, foo10A, foo15A, foo20A, foo25A};
Foo foo10B(10, "B");
Foo foo20B(20, "B");
Foo foo30B(30, "B");
Foo foo40B(40, "B");
Foo foo50B(50, "B");
Foo fooB[] = {foo10B, foo20B, foo30B, foo40B, foo50B};
std::vector<Foo> fooUnion;
std::set_union(fooA, fooA+5, fooB, fooB+5, std::back_inserter(fooUnion), comp);
for(const auto& f : fooUnion)
{
std::cout << f.id << ":" << f.name << std::endl;
}
}
Выход:
5:A
10:A
15:A
20:A
25:A
30:B
40:B
50:B
Да, из ссылки Вот:
Объединение двух наборов формируется элементами, которые присутствуют либо в одном из наборов, либо в обоих. Элементы из второго диапазона, которые имеют эквивалентный элемент в первом диапазоне, не копируются в результирующий диапазон.
Если хочешь со второго подобрать (fooB), вы меняете аргументы:
std::set_union(fooB, fooB+5, fooA, fooA+5, std::back_inserter(fooUnion), comp);
Других решений пока нет …