Шаблонна функція std::difference призначена для визначення різниці першої множини відносно другої. Множини представляються у вигляді послідовності елементів, які розміщені в одному з контейнерів, який підтримує ітератори вводу (наприклад vector або deque). Оголошення функції виглядає наступним чином:
template <class InputIterator1,
class InputIterator2,
class OutputIterator>
OutputIterator set_difference (InputIterator1 begin1,
InputIterator1 end1,
InputIterator2 begin2,
InputIterator2 end2,
OutputIterator result) ;
/* з бінарним предикатом, для вказування необхідного порядку */
template <class InputIterator1,
class InputIterator2,
class OutputIterator,
class Compare>
OutputIterator set_difference (InputIterator1 begin1,
InputIterator1 end1,
InputIterator2 begin2,
InputIterator2 end2,
OutputIterator result,
Compare comp) ;
Параметри-ітератори begin1 i end1 призначені для обмежування першої множини. Параметри-ітератори begin2 i end2 призначені для обмежування другої множини, відносно якої буде виконуватися різниця. Параметр result призначений для вказування ітератора результуючої множини, елементи якої будуть заміщуватись новими елементами, що отримуються в результаті виконання операції різниці над двома множинами. Бінарний предикат comp (для другої версії функції), використовується для визначення порядку елементів у множинах, порівнюючи їх. Метод повертає ітератор, який вказує на елемент, який стоїть після останнього елементу результуючої множини (та, на яку вказує ітератор result).
Порядок елементів в множинах повинен визначатись оператором <. Для версії з предикатом повинен використовуватись бінарний предикат comp.
Щоб використовувати дану функцію у коді програми необхідно підключити файл algorithm:
#include <algorithm> /* set_difference і інші */
Приклади
Приклад #1
Розглянемо простий приклад отримання різниці з двох послідовностей, які представлені у якості об'єктів класу-контейнера std::vector. Сортування буде виконуватися алгоритмом std::sort.
#include <algorithm> /* sort for_each set_difference і інші */
#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_difference (v1.begin(), v1.end(),
v2.begin(), v2.end(),
resultv.begin()) ;
/* виводим цільову множину елементів на екран */
cout << "v1 - v2 : " ;
for_each (resultv.begin(), new_end, print_elem_pred<int>) ;
cout << endl ;
return 0 ;
}
Вивід програми наступний:
Приклад #2
Розглянемо приклад використання даного методу для іншого порядку елементів у множинах - спадаючого. Для нового порядку елементів використовується клас greater з файлу functional.
#include <algorithm> /* sort for_each set_difference і інші */
#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_difference (v1.begin(), v1.end(),
v2.begin(), v2.end(),
resultv.begin(),
greater_op) ; /* оператор > */
/* виводим цільову множину елементів на екран */
cout << "v1 - v2: " ;
for_each (resultv.begin(), new_end, print_elem_pred<int>) ;
cout << endl ;
return 0 ;
}
Вивід програми наступний:
Якщо б ми не відсортували усі множини одним оператором, тоді ось що би ми отримали:
Що відповідно не являється правильним результатом операції різниці двох множин.