copy_backward
Присваивает значения элементов из исходного диапазона диапазону назначения, выполняя итерации в исходной последовательности элементов и присваивая им новые позиции в обратном направлении.
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward(
BidirectionalIterator1 _First,
BidirectionalIterator1 _Last,
BidirectionalIterator2 _DestEnd
);
Параметры
_First
Двунаправленный итератор, обращающийся к положению первого элемента в исходном диапазоне._Last
Двунаправленный итератор, обращающийся к позиции, которая на единицу превышает позицию завершающего элемента в исходном диапазоне._DestEnd
Двунаправленный итератор, обращающийся к позиции, которая на единицу превышает позицию завершающего элемента в диапазоне назначения.
Возвращаемое значение
Итераторы вывода, обращающийся к позиции, которая на единицу превышает позицию завершающего элемента в диапазоне назначения, т. е. данный итератор обращается к _DestEnd — (_Last – _First ).
Заметки
Диапазон источника должен быть допустимым, а в месте назначения должно быть достаточно свободного пространства для всех скопированных элементов.
Алгоритм copy_backward обладает более строгими требованиями, чем алгоритм копирования. Его итераторы ввода и вывода должны быть двунаправленными.
Алгоритмы copy_backward и move_backward — единственные алгоритмы в библиотеке стандартных шаблонов, назначающие выходной диапазон с итератором, указывающим на конец диапазона назначения.
Поскольку алгоритм копирует исходные элементы по порядку, начиная с последнего элемента, диапазон назначения может перекрывать исходный диапазон, если позиция _First исходного диапазона не содержится в диапазоне назначения. copy_backward можно использовать для сдвигания элементов вправо, но не влево, кроме случаев, когда исходный диапазон и диапазон назначения перекрывают друг друга. Чтобы сдвинуть влево любое количество позиций, используйте алгоритм copy.
Алгоритм copy_backward изменяет только значения, на которые указывают итераторы, задавая новые значения элементам в диапазоне назначения. Его нельзя использовать для создания новых элементов и для вставки элементов напрямую в пустой контейнер.
Пример
// alg_copy_bkwd.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
vector <int> v1, v2;
vector <int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 5 ; ++i )
v1.push_back( 10 * i );
int ii;
for ( ii = 0 ; ii <= 10 ; ++ii )
v2.push_back( 3 * ii );
cout << "v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; ++Iter1 )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
// To copy_backward the first 3 elements of v1 into the middle of v2
copy_backward( v1.begin( ), v1.begin( ) + 3, v2.begin( ) + 7 );
cout << "v2 with v1 insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
// To shift the elements inserted into v2 two positions
// to the right
copy_backward( v2.begin( )+4, v2.begin( ) + 7, v2.begin( ) + 9 );
cout << "v2 with shifted insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
}
Выходные данные
v1 = ( 0 10 20 30 40 50 )
v2 = ( 0 3 6 9 12 15 18 21 24 27 30 )
v2 with v1 insert = ( 0 3 6 9 0 10 20 21 24 27 30 )
v2 with shifted insert = ( 0 3 6 9 0 10 0 10 20 27 30 )
Требования
Заголовок: <algorithm>
Пространство имен: std