Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Изменение порядка следования элементов
Изменить порядок следования элементов позволяют следующие функции:
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
Реквизиты
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов