Копирование и перемещение элементов

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

  • copy() — копирует элементы из диапазона между first и last в новый диапазон, начинающийся с позиции result. Возвращает итератор, указывающий на конец скопированного диапазона. Обратите внимание: диапазоны не должны пересекаться. Формат функции:
#include <algorithm>
iterator copy(first, last, result);

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(3, -1);
std::copy(arr.begin(), arr.begin() + 3, arr2.begin());
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
  • copy_n() — копирует n элементов, начиная с позиции first, в новый диапазон, начинающийся с позиции result. Возвращает итератор, указывающий на конец скопированного диапазона. Формат функции:
#include <algorithm>
iterator copy_n(first, _Size n, result);

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(3, -1);
std::copy_n(arr.begin(), 3, arr2.begin());
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
  • copy_if() — копирует элементы из диапазона между first и last для которых пользовательская функция pred вернула значение true и вставляет их в новый диапазон, начинающийся с позиции result. Возвращает итератор, указывающий на конец скопированного диапазона. Формат функции:
#include <algorithm>
iterator copy_if(first, last, result, pred);

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(5, -1);
auto it = std::copy_if(arr.begin(), arr.end(), arr2.begin(),
                       [](const int &x){ return x > 2; });
if (it != arr2.end()) {
   arr2.resize(std::distance(arr2.begin(), it));
}
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 3 4 5
  • copy_backward() — копирует элементы из диапазона между first и last в новый диапазон, заканчивающийся позицией result. Элементы копируются в обратном направлении. Возвращает итератор, указывающий на начало скопированного диапазона. Формат функции:
#include <algorithm>
iterator copy_backward(first, last, result);

Пример:

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

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(5, -1);
std::move(arr.begin(), arr.begin() + 3, arr2.begin());
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3 -1 -1
  • move_backward() — перемещает элементы из диапазона между first и last в новый диапазон, заканчивающийся позицией result. Элементы перемещаются в обратном направлении. Возвращает итератор, указывающий на начало скопированного диапазона. Формат функции:
#include <algorithm>
iterator move_backward(first, last, result);

Пример:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(5, -1);
std::move_backward(arr.begin(), arr.begin() + 3, arr2.end());
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // -1 -1 1 2 3
  • transform() — копирует элементы из одного или двух диапазонов, применяет к ним пользовательскую функцию и вставляет результат в новый диапазон, начинающийся с позиции result. Возвращает итератор, указывающий на конец скопированного диапазона. Форматы функции:
#include <algorithm>
iterator transform(first, last, result, unary_op);
iterator transform(first1, last1, first2, result, binary_op);

Умножим каждый элемент массива на 2 и скопируем результат в другой массив:

std::vector<int> arr = {1, 2, 3, 4, 5}, arr2(5, -1);
std::transform(arr.begin(), arr.end(), arr2.begin(),
               [](const int &x){ return x * 2; });
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 2 4 6 8 10

Вычислим сумму соответствующих по позиции элементов из двух диапазонов и скопируем результат в другой массив:

std::vector<int> arr = {1, 2, 3}, arr2 = {4, 5, 6}, res(3, -1);
std::transform(arr.begin(), arr.end(), arr2.begin(), res.begin(),
               [](const int &a, const int &b){ return a + b; });
for (int &el : res) std::cout << el << ' ';
std::cout << std::endl; // 5 7 9

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

Помощь сайту

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

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