cpp

Изменение порядка следования элементов

Изменить порядок следования элементов позволяют следующие функции:

  • reverse() — меняет порядок следования элементов на противоположный. Диапазон внутри контейнера задается с помощью двух итераторов:
// #include <algorithm>
std::vector<int> arr = {1, 2, 3, 4, 5};
std::reverse(arr.begin(), arr.end());
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 5 4 3 2 1
  • reverse_copy() — копирует элементы из указанного диапазона и вставляет их в другой контейнер, при этом меняя порядок следования элементов на противоположный. Диапазон внутри контейнера задается с помощью двух итераторов. Итератор, указывающий на начальную позицию вставки, передается в третьем параметре. Функция возвращает итератор, указывающий на позицию после вставленных элементов:
// #include <algorithm>
std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(5, 0);
std::reverse_copy(arr.begin(), arr.end(), arr2.begin());
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3 4 5
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 5 4 3 2 1
  • rotate() — сдвигает все элементы влево таким образом, чтобы элемент, на который указывает итератор middle, стал первым. Элементы из начала диапазона будут перемещены в конец. Функция как бы вращает элементы внутри диапазона, при этом не меняя их последовательность. Начало и конец диапазона задаются с помощью итераторов first и last. Формат функции:
#include <algorithm>
iterator rotate(first, middle, last);

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5};
std::rotate(arr.begin(), arr.begin() + 2, arr.end());
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 3 4 5 1 2
  • rotate_copy() — функция аналогична функции rotate(), но результат копируется в диапазон с начальной позицией, заданной итератором result. Формат функции:
#include <algorithm>
iterator rotate_copy(first, middle, last, result);

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(5, 0);
std::rotate_copy(arr.begin(), arr.begin() + 2, arr.end(),
                 arr2.begin());
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3 4 5
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 3 4 5 1 2
  • random_shuffle() — перемешивает элементы из диапазона случайным образом. Формат функции:
#include <algorithm>
void random_shuffle(first, last[, gen]);

Если параметр gen не задан, то используется генератор случайных чисел по умолчанию:

std::vector<int> arr = {1, 2, 3, 4, 5};
std::random_shuffle(arr.begin(), arr.end());
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // Например: 5 2 4 3 1

В параметре gen можно указать пользовательскую функцию, генерирующую случайные числа со значениями меньше, чем значение параметра, и большими или равными нулю:

// #include <cstdlib>
// #include <ctime>
std::srand(static_cast<unsigned int>( std::time(nullptr) ));
std::vector<int> arr = {1, 2, 3, 4, 5};
std::random_shuffle(arr.begin(), arr.end(),
                    [](const int &x){ return std::rand() % x; });
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // Например: 3 5 2 4 1
  • shuffle() — перемешивает элементы списка случайным образом, используя генераторы случайных чисел из заголовочного файла random. Формат функции:
#include <algorithm>
void shuffle(first, last, gen);

Пример:

// #include <random>
// #include <chrono>
using std::chrono::system_clock;
auto seed = system_clock::now().time_since_epoch().count();
std::mt19937 gen(seed);
std::vector<int> arr = {1, 2, 3, 4, 5};
std::shuffle(arr.begin(), arr.end(), gen);
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // Например: 5 1 3 2 4
  • swap() — меняет местами значения двух переменных или массивов. Начиная со стандарта C++11, для использования функции нужно подключить заголовочный файл utility. Поменяем местами значения двух переменных:
// #include <utility>
int x = 5, y = 3;
std::swap(x, y);
std::cout << x << std::endl; // 3
std::cout << y << std::endl; // 5

Поменяем местами элементы двух массивов:

// #include <utility>
int arr1[3] = {1, 2, 3}, arr2[3] = {4, 5, 6};
std::swap(arr1, arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3

Существуют специализации функции swap(), принимающие конкретные типы данных, вместо обобщенных. Например, поменяем местами элементы объектов класса vector:

std::vector<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
std::swap(arr1, arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
  • iter_swap() — меняет местами значения элементов, на которые указывают два итератора. Поменяем местами значения первых элементов двух объектов класса vector:
// #include <algorithm>
std::vector<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
std::iter_swap(arr1.begin(), arr2.begin());
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 5 6
  • swap_ranges() — меняет местами значения элементов из двух диапазонов. Диапазон внутри первого контейнера задается с помощью итераторов first1 и last1, а начало диапазона внутри второго контейнера — с помощью итератора first2. Формат функции:
#include <algorithm>
iterator swap_ranges(first1, last1, first2);

Пример:

std::vector<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
std::swap_ranges(arr1.begin(), arr1.end(), arr2.begin());
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
  • next_permutation() — выполняет следующую перестановку элементов в диапазоне между first и last. Функция возвращает значение true, если перестановка выполнена, и false — в противном случае. Первоначально диапазон должен быть отсортирован по возрастанию. Если функцию применять в цикле, то в итоге получим все возможные комбинации перестановок элементов. На конечном шаге получим сортировку диапазона в обратном направлении. По умолчанию сравнение производится с помощью оператора <. В параметре comp можно указать пользовательскую функцию сравнения. Формат функции:
#include <algorithm>
bool next_permutation(first, last[, comp]);

Пример:

std::vector<int> arr = {1, 2, 3};
std::sort(arr.begin(), arr.end());
do {
   for (int &el : arr) std::cout << el << ' ';
   std::cout << std::endl;
} while (std::next_permutation(arr.begin(), arr.end()));

Результат:

1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 
  • prev_permutation() — выполняет предыдущую перестановку элементов в диапазоне между first и last. Функция возвращает значение true, если перестановка выполнена, и false — в противном случае. По умолчанию сравнение производится с помощью оператора <. В параметре comp можно указать пользовательскую функцию сравнения. Формат функции:
#include <algorithm>
bool prev_permutation(first, last[, comp]);

Пример:

std::vector<int> arr = {1, 2, 3};
std::sort(arr.begin(), arr.end());
std::reverse(arr.begin(), arr.end());
do {
   for (int &el : arr) std::cout << el << ' ';
   std::cout << std::endl;
} while (std::prev_permutation(arr.begin(), arr.end()));

Результат:

3 2 1 
3 1 2 
2 3 1 
2 1 3 
1 3 2 
1 2 3 

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Реквизиты

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp