std::copyとstd::copy_backward

std::copyは入力と出力がオーバーラップしている場合,注意して使用しなければなりません.入力の前半と出力の後半がオーバーラップしてる場合のみ,std::copyが安全に使用できます.例えば以下のような場合std::copyは安全に使用できます.

int a[10] = {0,1,2,3,4,5,6,7,8,9};
std::copy(a + 1, a + 10, a);
// aは{1,2,3,4,5,6,7,8,9,9}となる

このようなオーバーラップに対してstd::copyが安全に適用できるのは,std::copyが先頭から順に要素をコピーしていくことを保証しているからです.
逆に入力の後半と出力の前半がオーバーラップしているときにはstd::copyは意図したとおりに機能しません.この場合,STLアルゴリズムの中でもかなりマイナーな部類に入るstd::copy_backwardを利用します.

int a[10] = {0,1,2,3,4,5,6,7,8,9};
std::copy_backward(a, a + 9, a + 10); // [a, a+9)を[a+1, a+10)にコピー
// aは{0,0,1,2,3,4,5,6,7,8}となる

std::copy_backwardは基本的にstd::copyと同じことをしますが,後ろから前に要素のコピーを行っていくことが特徴です.これによって上のようなオーバーラップの場合でも安全にコピーが可能となります.またstd::copy_backwardのもう一つ特徴的なこととして,コピー先の指定には終端(もちろんpass-the-endな値)を指定しなければならないことが挙げられます.また,入力・出力のイテレータ共に双方向反復子が要求されます.
要するに入力と出力がオーバーラップするときのコピーにはstd::copyとstd::copy_backwardの使い分けに注意しましょう,ということです.もちろん,入力と出力がオーバーラップしていない場合にわざわざstd::copy_backwardを使う理由はありません.
参考:
http://www.sgi.com/tech/stl/copy.html
http://www.sgi.com/tech/stl/copy_backward.html