Функция copy_backward
Функция copy_backward из заголовочного файла algorithm
копирует элементы из исходного диапазона в целевой диапазон
в обратном порядке. В отличие от функции copy, которая
копирует элементы слева направо, copy_backward начинает
копирование с последнего элемента и движется к первому.
Это особенно полезно, когда целевой диапазон перекрывается
с исходным, и копирование слева направо привело бы к
перезаписи ещё не скопированных данных.
В первый и второй параметры мы передаём итераторы, задающие
исходный диапазон [first, last). Третий параметр -
итератор d_last, указывающий на конец целевого диапазона.
Копирование идёт справа налево: элемент *(last - 1)
попадает в *(d_last - 1) и так далее. Функция возвращает
итератор на начало скопированного диапазона в приёмнике.
Синтаксис
#include <algorithm>
copy_backward(first, last, d_last);
Пример
Давайте скопируем вектор {1, 2, 3, 4, 5} в другой вектор
в обратном порядке:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> src = {1, 2, 3, 4, 5};
vector<int> dst(5);
copy_backward(src.begin(), src.end(), dst.end());
for (int el : dst) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5
Обратите внимание: хотя копирование идёт справа налево, порядок элементов в приёмнике сохраняется таким же, как в источнике, потому что последний элемент источника записывается в последнюю ячейку приёмника.
Пример
Главное преимущество copy_backward проявляется при
перекрывающихся диапазонах. Сдвинем элементы вектора
вправо на две позиции:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5, 0, 0};
copy_backward(vec.begin(), vec.begin() + 5, vec.end());
for (int el : vec) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 1 2 3 4 5
Если бы мы использовали обычную copy, то при
перекрытии диапазонов часть данных была бы затёрта
до того, как её успели бы скопировать.