Шаблонна функція std::set_union призначена для об'єднання двох сортованих множин.
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union (InputIterator1 begin1, InputIterator1 end1,
                          InputIterator2 begin2, InputIterator2 end2,
                          OutputIterator result) ;

/* з бінарним предикатом */
template <class InputIterator1, class InputIterator2,
          class OutputIterator, class Compare>
  OutputIterator set_union (InputIterator1 begin1, InputIterator1 end1,
                            InputIterator2 begin2, InputIterator2 end2,
                            OutputIterator result, Compare comp) ;
Параметри-ітератори begin1 i end1 призначені для вказування меж першої сортованої множини. Параметри-ітератори begin2 i end2 призначені для вказування меж другої сортованої множини. Параметр-ітератор result призначений для вказування місця, куди будуть вставлятися елементи результуючої множини елементів. Параметр бінарний предикат comp призначений для вказування об'єкта компаратора, який відповідальний за порядок елементів у множинах. Метод повертає ітератор, який вказує на кінець результуючої множини. Об'єднана множина формується з елементів, які присутні або в одній з множин, або з двох. Елементи з другої множини, які присутні у першій, не копіюються в результуючу множину. В даній версії функції використовується оператор "<". Два елементи являються еквівалентними, якщо перший не менший другого, і другий не менший першого, тобто (a<b || b<a) == false. Послідовності елементів, з яких повинна утворюватися цільова множина повинні бути сортованими за одинаковим критерієм (оператор < або comp). Щоб використовувати дану функцію необхідно підключити файл algorithm:
#include <algorithm> /* функція std::set_union */

Приклад

Приклад #1

Розглянемо простий приклад використання даного методу, для об'єднання двох множин елементів. Перед об'єднанням двох послідовностей, ми попередньо їх відсортуємо використовуючи алгоритм std::sort. Усі послідовності будуть міститись у контейнері std::vector.
#include <algorithm> /* sort for_each set_union і інші */
#include <iostream> /* об'єкт cout */
#include <vector> /* об'єкт vector  */
using namespace std ; /* друкуємо усе без std  */

/* шаблонна функція, яка виводить на екран 
** переданий параметр разом з слідуючою 
**крапкою з комою і пробілом (для алгоритму for_each) */
template <typename T> void print_elem_pred (T& e)
{ cout << e << "; " ; }

/* головна функція програми */
int main (int argc, char** argv)
{
  /* створюємо піддсолідні контейнери-вектори */
  vector<int> v1, v2, resultv ;
  
  /* заповнюємо джерельні вектори певними даними */
  for (int iter=0; iter<10; ++iter)
  {
    v1.push_back (iter) ;
    
    if ((iter%2)==0) { v2.push_back (iter*2) ; }
    else             { v2.push_back (iter) ; }
  }
  
  /* сортуємо, для певності, заповнені 
  ** джерельні вектори */
  sort (v1.begin(), v1.end()) ;
  sort (v2.begin(), v2.end()) ;
  
  /* виводимо вміст джерельних векторів 
  ** на екран для наглядності */
  cout << "v1: " ;
  for_each (v1.begin(), v1.end(), print_elem_pred<int>) ;
  cout << endl << "v2: ";
  for_each (v2.begin(), v2.end(), print_elem_pred<int>) ;
  cout << endl ;
  
  /* створюємо достатньо місця для збереження нових елементів */
  resultv.resize (v1.size() + v2.size(), 0) ;
  
  /* виконуємо об'єднання двох множин 
  ** разом з збереженням ітератора, який вказує на кінець
  ** новоствореної множини */
  vector<int>::iterator new_end = set_union (v1.begin(), v1.end(), 
                                             v2.begin(), v2.end(), 
                                             resultv.begin()) ;
  
  /* виводим цільову множину елементів на екран */
  cout << "resultv: " ;
  for_each (resultv.begin(), new_end, print_elem_pred<int>) ;
  cout << endl ;
  
  return 0 ;
}
Вивід програми наступний: cpp_std_set_union_sample1-cxx

Приклад #2

Розглянемо приклад використання функції set_union з предикатом, на випадок, коли ми бажаємо об'єднати дві множини з зворотнім порядком. За новий порядок сортування буде відповідати стандартний клас STL std::greater.
#include <algorithm> /* sort for_each set_union і інші */
#include <functional> /* less greater і інші */
#include <iostream> /* об'єкт cout */
#include <vector> /* об'єкт vector  */
using namespace std ; /* друкуємо усе без std  */

/* шаблонна функція, яка виводить на екран 
** переданий параметр разом з слідуючою 
**крапкою з комою і пробілом (для алгоритму for_each) */
template <typename T> void print_elem_pred (T& e)
{ cout << e << "; " ; }

/* головна функція програми */
int main (int argc, char** argv)
{
  /* створюємо піддсолідні контейнери-вектори */
  vector<int> v1, v2, resultv ;
  
  /* заповнюємо джерельні вектори певними даними */
  for (int iter=0; iter<10; ++iter)
  {
    v1.push_back (iter) ;
    
    if ((iter%2)==0) { v2.push_back (iter*2) ; }
    else             { v2.push_back (iter) ; }
  }
  
  /* створюємо об'єкт порівняння оператором > */
  greater<int> greater_op ;
  
  /* сортуємо, для певності, заповнені 
  ** джерельні вектори pf за допомогою методу
  ** sort з предикатом оператора >, 
  ** який міститься в функціональному об'єкті 
  ** класу greater<int> */
  sort (v1.begin(), v1.end(), greater_op) ;
  sort (v2.begin(), v2.end(), greater_op) ;
  
  /* виводимо вміст джерельних векторів 
  ** на екран для наглядності */
  cout << "v1: " ;
  for_each (v1.begin(), v1.end(), print_elem_pred<int>) ;
  cout << endl << "v2: ";
  for_each (v2.begin(), v2.end(), print_elem_pred<int>) ;
  cout << endl ;
  
  /* створюємо достатньо місця для збереження нових елементів */
  resultv.resize (v1.size() + v2.size(), 0) ;
  
  /* виконуємо об'єднання двох множин 
  ** разом з збереженням ітератора, який вказує на кінець
  ** новоствореної множини */
  vector<int>::iterator new_end = set_union (v1.begin(), v1.end(), 
                                             v2.begin(), v2.end(), 
                                             resultv.begin(),
                                             greater_op) ; /* оператор > */
  
  /* виводим цільову множину елементів на екран */
  cout << "resultv: " ;
  for_each (resultv.begin(), new_end, print_elem_pred<int>) ;
  cout << endl ;
  
  return 0 ;
}
Вивід програми: cpp_std_set_union_sample2-cxx
Категорії: