C++. STL. Алгоритми. Алгоритми обміну значеннями елементів послідовності

Модифікуючі алгоритми. Частина 2
Алгоритми обміну значеннями елементів послідовності


Зміст


Пошук на інших ресурсах:

1. Алгоритм swap. Обмін значеннями двох змінних (об’єктів)

Для обміну значеннями двох об’єктів або масивів об’єктів використовується алгоритм swap. Алгоритм має декілька реалізацій, найбільш поширені з яких наступні

template <class Type>
void swap(
  Type& left,
  Type& right);
  template <class Type, size_t N>
  void swap(
  Type (& left)[N],
  Type (& right)[N]);

тут

  • left, right – об’єкти, значення яких потрібно обміняти місцями;
  • N – розмір масивів об’єктів.

Приклад.

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;

int main()
{
  // Алгоритм swap - Обмін значеннями
  // 1. Обмін типів int
  int a = 8, b = 9;
  swap(a, b);
  cout << "a = " << a << ", b = " << b << endl; // a = 9, b = 8

  // 2. Обмін масивами фіксованого розміру
  int A1[] = { 1, 5, 3 };
  int A2[] = { 2, 8, 4 };

  swap(A1, A2);

  cout << "A1 => ";
  for (int i : A1)
    cout << i << " ";
  cout << endl;

  cout << "A2 => ";
  for (int i : A2)
    cout << i << " ";
  cout << endl;

  // 3. Обмін значеннями покажчиків unique_ptr<T>
  unique_ptr<int> p1(new int(38));
  unique_ptr<int> p2(new int(29));
  swap(p1, p2);
  cout << "p1->" << *p1 << endl;
  cout << "p2->" << *p2 << endl;

  // 4. Обмін значеннями покажчиків shared_ptr<T>
  shared_ptr<int> ps1(new int(100));
  shared_ptr<int> ps2(new int(50));
  swap(ps1, ps2);
  cout << "ps1->" << *ps1 << endl;
  cout << "ps2->" << *ps2 << endl;

  // 5. Обмін значеннями векторів
  vector<int> v1 = { 1, 3, 8, 4 };
  vector<int> v2 = { 7, 9, 0 };
  swap(v1, v2);
  cout << "v1 => ";
  for (int i : v1)
    cout << i << " ";
  cout << endl;
  cout << "v2 => ";
  for (int i : v2)
    cout << i << " ";
  cout << endl;
}

Результат

a = 9, b = 8
A1 => 2 8 4
A2 => 1 5 3
p1->29
p2->38
ps1->50
ps2->100
v1 => 7 9 0
v2 => 1 3 8 4

 

2. Алгоритм swap_ranges. Обміняти місцями діапазони елементів двох послідовностей

Алгоритм swap_ranges обмінює місцями елементи двох діапазонів. Найбільш поширена реалізація алгоритму має наступний вигляд

template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges(
  ForwardIterator1 first1,
  ForwardIterator1 last1,
  ForwardIterator2 first2 );

тут

  • first1, last1 – прямі ітератори, що задають перший діапазон елементів;
  • first2 – прямий ітератор, що задає початок другого діапазону елементів.

Приклад.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
  // Алгоритм swap_ranges - міняє місцями елементи заданого діапазону

  // 1. Оголосити 2 вектори та вивести їх на екран
  vector<char> V1 = { 'a', 'b', 'c', 'd', 'e', 'f' };
  vector<char> V2 = { '0', '1', '2', '3', '4' };

  cout << "V1 => ";
  for (char c : V1)
    cout << c << " ";
  cout << endl;

  cout << "V2 => ";
  for (char c : V2)
    cout << c << " ";
  cout << endl;
  cout << "-------------------" << endl;

  // 2. Створити ітератори на початок та кінець діапазону
  // у векторі V1
  vector<char>::iterator itBegin = V1.begin();
  vector<char>::iterator itEnd = V1.begin();
  itEnd++;
  itEnd++; // itEnd -> 'c'

  // 3. Створити ітератори на початок та кінець
  // діапазону у векторі V2
  vector<char>::iterator itBegin2 = V2.begin();
  itBegin2 += 3; // itBegin2 -> '3'

  // 4. Виклик алгоритму
  swap_ranges(itBegin, itEnd, itBegin2);

  // 5. Вивести вектор V1
  cout << "V1 => ";
  for (char c : V1)
    cout << c << " ";
  cout << endl;

  // 6. Вивести вектор V2
  cout << "V2 => ";
  for (char c : V2)
    cout << c << " ";
  cout << endl;
}

Результат

V1 => a b c d e f
V2 => 0 1 2 3 4
-------------------
V1 => 3 4 c d e f
V2 => 0 1 2 a b

 

3. Алгоритм iter_swap. Обмін місцями двох значень на які вказують ітератори

Алгоритм iter_swap здійснює обмін місцями двох значень, на які вказують ітератори. Згідно з документацією, шаблон алгоритму наступний

template <class ForwardIterator1, class ForwardIterator2>
void iter_swap( ForwardIterator1 left, ForwardIterator2 right );

тут

  • left – ітератор на перше значення (значення, яке розміщується зліва);
  • right – ітератор на друге значення (значення, яке розміщується справа).

Приклад.

#include <iostream>
#include <queue>
#include <vector>
#include <list>
#include <functional>
#include <algorithm>
using namespace std;

int main()
{
  // Алгоритм iter_swap - міняє місцями два значення, на які вказують ітератори

  // 1. Оголосити вектор
  vector<double> V1 = { 1.1, 2.2, 2.7, 2.8, 3.2 };

  // 2. Вивести вектор
  cout << "V1 => ";
  for (double x : V1)
    cout << x << " ";
  cout << endl;

  // 3. Встановити ітератори на перший та останній елементи вектору
  vector<double>::iterator it1 = V1.begin();
  vector<double>::iterator it2 = V1.begin();
  while (it2 != V1.end()) it2++;
  it2--;

  // 4. Обміняти місцями - алгоритм iter_swap
  iter_swap(it1, it2);

  // 5. Повторно вивести вектор V1
  cout << "V1 => ";
  for (double x : V1)
    cout << x << " ";
  cout << endl;
}

Результат

V1 => 1.1 2.2 2.7 2.8 3.2
V1 => 3.2 2.2 2.7 2.8 1.1

 


Споріднені теми