всегда ли std set_union берет общие элементы с первого

Когда в двух массивах есть общие элементы, всегда ли std 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

person Daneil    schedule 19.04.2017    source источник
comment
Эта std::set_union ссылка должна быть полезной.   -  person Some programmer dude    schedule 19.04.2017


Ответы (1)


Да, по ссылке здесь:

Объединение двух множеств образуется элементами, присутствующими либо в одном из множеств, либо в обоих. Элементы из второго диапазона, имеющие эквивалентный элемент в первом диапазоне, не копируются в результирующий диапазон.

Если вы хотите, чтобы он выбирал из второго (fooB), вы меняете аргументы местами:

std::set_union(fooB, fooB+5, fooA, fooA+5, std::back_inserter(fooUnion), comp);
person Zhenxiao Hao    schedule 19.04.2017