C++STL std::copy詳細


シーケンスをコンテナにコピーする場合は、std::copyアルゴリズムを使用します.コードは次のとおりです.
std::copy(start, end, std::back_inserter(container));
ここで、startとendは入力シーケンス(N要素があると仮定)の反復器である(iterator)containerは、関数push_backを含むコンテナです.containerが空になると、copyが完了するとN個の要素が含まれ、元のキューの要素の順序と同じ順序になります.標準ライブラリで提供されるback_inserterテンプレート関数は、containerにback_insert_iterator反復器を返すため便利です.制の要素はすべてcontainerの末尾に追加されました. 
次にcontainerが空でないことを仮定します(たとえば、containerはループで何度も繰り返し使用する必要があります).では、元のターゲットに達するには、clear関数を呼び出してから新しいシーケンスを挿入する必要があります.これにより、古い要素オブジェクトが解析され、新しく追加された構造になります.それだけでなく、container自身が使用するダイナミックメモリも解放され、list、map、setのノードのように作成されます..一部のvectorの実装では、clearを呼び出すとすべてのメモリが解放されます.
 
通常、既存の要素に直接copyを上書きするとより効率的であることを考慮します.わざとこうします.
std::copy(start, end, container.begin());

ここではcontainerのヘッダでcopy-over(割り当てを上書き)操作を行いますが、containerのサイズが入力シーケンスの長さNより小さい場合、このコードはクラッシュ(crash)を招きます.
eg1:
int a[3] = {1, 2, 3};
int b[3];
std::copy(a, a+3, b);
for(int j=0; j<3; j++)
	cout<< b[j] << endl;

eg2:
vector temp(3);
int a[3] = {1, 2, 3};
std::copy(a, a+3, &temp.front());
for(int j=0; j<3; j++)
	cout<< temp[j] << endl;

copyはコピーのみを担当し、申請スペースを担当しないので、コピーする前に十分なスペースが必要です.
テキストリンク:http://blog.sina.com.cn/s/blog_8655aeca0100t6qe.html