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

Приклад #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 ;
}
Вивід програми наступний: cpp_std_set_difference_sample2-cxxЯкщо б ми не відсортували усі множини одним оператором, тоді ось що би ми отримали: cpp_std_set_difference_sample2-cxx_wrong_outputЩо відповідно не являється правильним результатом операції різниці двох множин.
Категорії: