C ++ 17 стандартная тяга
Стандартный черновик C ++ 17 n4659 *1006* говорит:
28.6.1 «Копировать»:
template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator result);
1 Требуется: результат не должен находиться в диапазоне [первый, последний).
2 Эффекты: копирует элементы в диапазоне [первый, последний) в диапазон [результат, результат + (последний -
первый)) начиная с первого и заканчивая последним.
и
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2
copy_backward(
BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result);
17 Требуется: результат не должен быть в диапазоне (первый, последний).
18 Эффекты: копирует элементы из диапазона [first, last) в диапазон [result - (last-first),
результат) начиная с последнего - 1 и переходя к первому. (263) Для каждого натурального числа n <= (последний -
первый), выполняет * (результат - n) = * (последний - n). </p>
В примечании объясняется, когда использовать copy_backward
:
263) copy_backward следует использовать вместо copy, когда последний находится в диапазоне [результат - (последний - первый), результат)
Следовательно, для этих функций не требуется никаких перекрытий, и в отличие от memcpy
, поведение перекрытий четко определено в разделах Effects
.
Вы просто выбираете между ними, потому что вы обычно хотите std::copy
для копирования влево и std::copy_backward
для копирования влево.
C ++ также имеет ранжированную версию std::move
в <algorithm>
, которая перемещается вместо копирования.