C++ で vector からサブベクタを抽出する方法

  1. リストの初期化記法を用いてベクトルからサブベクタを抽出する
  2. 関数 copy() を用いて,ベクトルからサブベクトルを抽出する

この記事では、C++ の vector からサブベクタを抽出する方法をいくつか説明します。

リストの初期化記法を用いてベクトルからサブベクタを抽出する

サブベクトルを抽出する一つの方法として,元のベクトルの要素で新しい vector を初期化する方法があります.以下のメソッドは,任意の位置を指すイテレータを用いて要素を指定します( int_vec からの最初の 5つの要素).この例では、std::copy メソッドを用いてベクトル要素をコンソールに出力していることに注目してください。

#include <iostream>
#include <vector>
#include <iterator>
#include <iomanip>

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

int main() {
    vector<int> int_vec {1, 23, 43, 324, 10, 222, 424,
                            649, 1092, 110, 129, 40, 3024};

    vector<int> sub_vec {int_vec.begin(), int_vec.begin()+5};

    cout << std::left << setw(10) << "vec: ";
    copy(int_vec.begin(), int_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;

    cout << std::left << setw(10) << "subvec: ";
    copy(sub_vec.begin(), sub_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;

    return EXIT_SUCCESS;
}

出力:

vec:      1; 23; 43; 324; 10; 222; 424; 649; 1092; 110; 129; 40; 3024;
subvec:   1; 23; 43; 324; 10;

あるいは,元のベクトルの任意の要素(例えば &int_vec[index])へのポインタを指定して,サブベクトル変数を初期化することもできます.

#include <iostream>
#include <vector>
#include <iterator>
#include <iomanip>

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

int main() {
    vector<int> int_vec {1, 23, 43, 324, 10, 222, 424,
                            649, 1092, 110, 129, 40, 3024};

    vector<int> sub_vec {&int_vec[0], &int_vec[5]};

    cout << std::left << setw(10) << "vec: ";
    copy(int_vec.begin(), int_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;

    cout << std::left << setw(10) << "subvec: ";
    copy(sub_vec.begin(), sub_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;

    return EXIT_SUCCESS;
}

出力:

vec:      1; 23; 43; 324; 10; 222; 424; 649; 1092; 110; 129; 40; 3024;
subvec:   1; 23; 43; 324; 10;

関数 copy() を用いて,ベクトルからサブベクトルを抽出する

関数 copy() は範囲ベースのデータを操作するための強力なツールである。今回は、ある vector から別の vector (サブベクトル) に特定の要素をリテラルにコピーするためにこれを利用します。まず、コピーする要素を含む sub_vec 変数を宣言します。次に、元の vector の範囲を copy() 関数に引数として渡し、begin イテレータでコピー先の vector に渡します。

#include <iostream>
#include <vector>
#include <iterator>
#include <iomanip>

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

constexpr int NUM_ELEMS_TO_COPY = 6;

int main()
{
    vector<int> int_vec {1, 23, 43, 324, 10, 222, 424,
                            649, 1092, 110, 129, 40, 3024};
    vector<int> sub_vec (NUM_ELEMS_TO_COPY);

    copy(&int_vec[0], &int_vec[NUM_ELEMS_TO_COPY], sub_vec.begin());

    cout << std::left << setw(10) << "subvec: ";
    copy(sub_vec.begin(), sub_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;

    return EXIT_SUCCESS;
}
subvec:   1; 23; 43; 324; 10; 222;

copy() メソッドを使ったもう一つの強力なテクニックは、既存の vector 変数にサブベクトルを追加することです。次のサンプルコードは、std::back_inserter 関数テンプレートを用いて、抽出した 5つの要素を sub_vec 変数に戻しています。なお、copy メソッドは要素の範囲を [first, last]として扱うことに注意してください。

#include <iostream>
#include <vector>
#include <iterator>
#include <iomanip>

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

int main()
{
    vector<int> int_vec {1, 23, 43, 324, 10, 222, 424,
                            649, 1092, 110, 129, 40, 3024};
    vector<int> sub_vec = { 1, 2, 3, 4, 5, 6 };

    copy(&int_vec[0], &int_vec[5], std::back_inserter(sub_vec));

    cout << std::left << setw(10) << "subvec: ";
    copy(sub_vec.begin(), sub_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;

    return EXIT_SUCCESS;
}
subvec:   1; 2; 3; 4; 5; 6; 1; 23; 43; 324; 10;

関連記事 - C++ Vector

  • C++ で vector を初期化する方法
  • comments powered by Disqus