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

胡金庫 2023年10月12日
  1. リストの初期化記法を用いてベクトルからサブベクタを抽出する
  2. 関数 copy() を用いて、ベクトルからサブベクトルを抽出する
C++ で vector からサブベクタを抽出する方法

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

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

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

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

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

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

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

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

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

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

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

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;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Vector