パープルハット

※当サイトではGoogleアドセンス広告を利用しています

C++ vectorのコピー(std::copy)



std::copyとは?

  • 指定されたイテレータ範囲の要素のコピーが可能になる関数です。
  • これにより、for文を使わずvectorを別のvectorにコピーするといったことが可能になります。
  • 参考サイト:copy - cpprefjp C++日本語リファレンス
  • また、std::copyの引数を以下の表に示します。
第1引数 コピーのイテレータの先頭
第2引数 コピーのイテレータの末尾
第3引数 コピーのイテレータの先頭





使用例1:vectorの全要素をコピー

コピー元(v1)、コピー先(v2)とすれば、引数は以下のようにします。

第1引数 v1.begin()
第2引数 v1.end()
第3引数 v2.begin()

ソースコード

#include <iostream>
#include <vector>
#include <algorithm>

int main(void) {

    // 配列の宣言
    std::vector<int> v1{3, 5, 6, 7, 8};
    std::vector<int> v2(v1.size()); //copyによりリサイズはされないので、サイズ設定はあらかじめしておく
    std::copy(v1.begin(), v1.end(), v2.begin());

    // v2の表示
    std::cout << "v2 = { ";
    for (int i = 0; i < v2.size(); i++) {
        std::cout << v2[i] << ", ";
    }
    puts("}");

    return 0;
}


実行結果

v2 = { 3, 5, 6, 7, 8, }





使用例2:vectorの一部のみをコピー

  • 引数のイテレーションをうまく設定することで全要素ではなく、一部だけコピーをすることが可能です。
  • 例) v2の1, 2番目の要素に、v1の0, 1番目の要素をコピーするときの各引数。
第1引数 v1.begin()
第2引数 v1.begin() + 2
第3引数 v2.begin() + 1

ソースコード

#include <iostream>
#include <vector>
#include <algorithm>

int main(void) {

    // 配列の宣言
    std::vector<int> v1{3, 5, 6, 7, 8};
    std::vector<int> v2{-1, -1, -1, -1};
    std::copy(v1.begin(), v1.begin() + 2, v2.begin() + 1);

    // v2の表示
    std::cout << "v2 = { ";
    for (int i = 0; i < v2.size(); i++) {
        std::cout << v2[i] << ", ";
    }
    puts("}");

    return 0;
}


実行結果

v2 = { -1, 3, 5, -1, }