C++ で vector からサブベクタを抽出する方法
胡金庫
2023年10月12日
この記事では、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;
著者: 胡金庫