C++ で配列をコピーする方法

胡金庫 2023年10月12日
  1. C++ で配列をコピーするには copy() 関数を使用する
  2. 関数 copy_backward() を用いて配列をコピーする
  3. 配列をコピーするには assign() メソッドを用いる
C++ で配列をコピーする方法

この記事では、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::copystd::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 |
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Array