Модифікуючі алгоритми. Частина 2
Алгоритми обміну значеннями елементів послідовності
Зміст
- 1. Алгоритм swap. Обмін значеннями двох змінних (об’єктів)
- 2. Алгоритм swap_ranges. Обміняти місцями діапазони елементів двох послідовностей
- 3. Алгоритм iter_swap. Обмін місцями двох значень на які вказують ітератори
- Споріднені теми
Пошук на інших ресурсах:
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
⇑
Споріднені теми
- Модифікуючі алгоритми. Частина 1. Алгоритми, які змінюють значення елементів послідовності. Алгоритми for_each, transform, fill, fill_n, generate, generate_n
- Модифікуючі алгоритми. Частина 3. Алгоритми, що виконують заміну елементів послідовності. Алгоритми replace, replace_if, replace_copy_if, replace_copy
- Модифікуючі алгоритми. Частина 4. Алгоритми, що витягують з послідовності окремі елементи або групи елементів: remove, remove_if, remove_copy, remove_copy_if, unique, unique_copy
- Модифікуючі алгоритми. Частина 5. Алгоритми, що обробляють послідовність в цілому не змінюючи значень елементів: copy, copy_backward, reverse, reverse_copy, rotate, rotate_copy, random_shuffle
⇑