関数テンプレート
std::コピー
template <class InputIterator, class OutputIterator> OutputIterator copy (InputIterator が最初、InputIterator が最後、OutputIterator 結果);
要素のコピー範囲
範囲 [first, last) の要素を result で始まる範囲にコピーします。
この関数は、宛先範囲の末尾に反復子を返します (最後にコピーされた要素の後の要素を指します)。
これらの範囲は、結果が範囲 [first, last) 内の要素を指すように重複してはなりません。この場合については、 copy_backwardを参照してください。
この関数テンプレートの動作は次と同等です。
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}
パラメータ:
最初の最後
コピーするシーケンスの最初と最後の位置に反復子を入力します。使用される範囲は [first, last) で、first が指す要素を含み、last が指す要素を除く、first と last の間のすべての要素が含まれます。
結果
ターゲット シーケンスの最初の位置に反復子を出力します。これは範囲 [first, last) 内の要素を指してはなりません。
戻り値
コピーされた要素のターゲット範囲の終わりまでの反復子。
例
// copy algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::copy
#include <vector> // std::vector
int main () {
int myints[]={10,20,30,40,50,60,70};
std::vector<int> myvector (7);
std::copy ( myints, myints+7, myvector.begin() );
std::cout << "myvector contains:";
for (std::vector<int>::iterator it = myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
出力:
myvector には次のものが含まれます: 10 20 30 40 50 60 70 |
添付:
copy はコピーのみを行い、スペースを適用することはありません。そのため、コピーする前に十分なスペースが必要です。コンテナのサイズが入力シーケンスの長さ N より小さい場合、このコードはクラッシュします。そこで今回は以下のように back_inserter を導入しました。
std::copy(src.begin(), src.end(), std::back_inserter(dest));
標準ライブラリによって提供される back_inserter テンプレート関数は、コンテナーの back_insert_iterator イテレーターを返すため、コピーされた要素がコンテナーの末尾に追加されるため、非常に便利です。(容器が空かどうかは関係ありません)。
この場合、代替方法は、宛先パラメーターとして back_insert_iterator を使用することです。イテレータは、コピーごとに要素を展開することで宛先コンテナを展開し、コンテナが各要素を保持できる十分な大きさになるようにします。
添付ファイル参照:リンク