C++ で配列をコピーする方法
胡金庫
2023年10月12日
この記事では、C++ で配列をコピーする方法を紹介します。
C++ で配列をコピーするには copy()
関数を使用する
copy()
メソッドは、1 回の関数呼び出しで範囲ベースの構造体をコピーする推奨された方法です。copy()
は範囲の最初と最後の要素と出力配列の先頭を受け取ります。3 番目のパラメータが元の範囲内にある場合、定義されていない動作をする可能性があることに注意してください。
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
vector<string> str_vec = {"Warty", "Hoary", "Breezy",
"Dapper", "Edgy", "Feisty"};
vector<string> new_vec(str_vec.size());
copy(str_vec.begin(), str_vec.end(), new_vec.begin());
cout << "new_vec - | ";
copy(new_vec.begin(), new_vec.end(),
std::ostream_iterator<string>(cout, " | "));
cout << endl;
return EXIT_SUCCESS;
}
出力:
new_vec - | Warty | Hoary | Breezy | Dapper | Edgy | Feisty |
関数 copy_backward()
を用いて配列をコピーする
copy_backward()
メソッドは、配列を元の要素と逆順にコピーすることができますが、順序は保持されます。重なり合う範囲をコピーする際には、std::copy
と std::copy_backward
メソッドを利用する際に注意すべき経験則があります: copy
は左にコピーする場合(コピー先の範囲の先頭がコピー元の範囲の外にある場合)に適しています。これに対して、右方向にコピーする場合は copy_backward
が適切です (コピー先の範囲の終わりがソースの範囲外になる)。
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using std::copy_backward;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
vector<string> str_vec = {"Warty", "Hoary", "Breezy",
"Dapper", "Edgy", "Feisty"};
vector<string> new_vec(str_vec.size());
copy_backward(str_vec.begin(), str_vec.end(), new_vec.end());
cout << "new_vec - | ";
copy(new_vec.begin(), new_vec.end(),
std::ostream_iterator<string>(cout, " | "));
cout << endl;
return EXIT_SUCCESS;
}
配列をコピーするには assign()
メソッドを用いる
assign()
は vector
コンテナのビルトインメソッドであり、呼び出し元の vector
オブジェクトの内容を範囲内の要素に置き換えます。このメソッドは、互いに容易に変換できる型のベクトルをコピーする際に便利です。以下のコード例では、char
ベクトルを assign
を 1 回呼び出すだけで int
ベクトルにコピーする方法を示します。
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
int main() {
vector<char> char_vec{'a', 'b', 'c', 'd', 'e'};
vector<int> new_vec(char_vec.size());
new_vec.assign(char_vec.begin(), char_vec.end());
cout << "new_vec - | ";
copy(new_vec.begin(), new_vec.end(), std::ostream_iterator<int>(cout, " | "));
cout << endl;
return EXIT_SUCCESS;
}
出力:
new_vec - | 97 | 98 | 99 | 100 | 101 |
著者: 胡金庫