Шаблонна функція 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 ;
}
Вивід програми наступний:
Приклад #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 ;
}
Вивід програми: