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

  1. C++ で配列をコピーするには copy() 関数を使う
  2. 関数 copy_backward() を用いて配列をコピーする
  3. 配列をコピーするには assign() メソッドを用いる

この記事では、C++ で配列をコピーする方法を紹介します。

C++ で配列をコピーするには copy() 関数を使う

copy() メソッドは、1 回の関数呼び出しで範囲ベースの構造体をコピーする推奨された方法です。copy() は範囲の最初と最後の要素と出力配列の先頭を受け取ります。3 番目のパラメータが元の範囲内にある場合、定義されていない動作をする可能性があることに注意してください。

#include <iostream>
#include <vector>
#include <iterator>
#include <string>

using std::cout; using std::endl;
using std::vector; using std::copy;
using std::string;

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 <vector>
#include <iterator>
#include <string>

using std::cout;
using std::endl;
using std::vector;
using std::copy_backward;
using std::string;

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 <vector>
#include <iterator>
#include <string>

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 |

関連記事 - C++ Array

  • C++で配列サイズを求める方法
  • C++ で 2 次元配列を関数に渡す方法
  • comments powered by Disqus