C++ の std::back_inserter 関数テンプレート
-
std::back_inserter
を使用して、コンテナーの最後に要素を追加するイテレーターを作成する -
std::back_inserter
とstd::set_intersection
アルゴリズムの併用
この記事では、C++ で std::back_inserter
関数テンプレートを利用する方法について説明します。
std::back_inserter
を使用して、コンテナーの最後に要素を追加するイテレーターを作成する
一般に、イテレータは、さまざまなコンテナタイプにアクセスするための共通のインターフェイスを提供します。実際、このインターフェースは STL アルゴリズムによって完全に利用されています。ただし、各コンテナは通常、内部データ構造に適したカスタム動作を実装していることに注意してください。
さらに、共通のイテレーターインターフェイスに加えて特別な機能を提供するイテレーターアダプターの概念があります。つまり、イテレータアダプタを表す挿入イテレータは、要素の割り当て操作を挿入に置き換え、STL アルゴリズムが新しい要素を上書きするのではなく、指定されたコンテナに追加できるようにします。
3つの事前定義された挿入イテレータがあります:バックインサーター、フロントインサーター、および一般インサーター。この場合、コンテナの最後に要素を追加するためのバックインサーターを示します。バックインサーターは、push_back
メンバー関数を持つコンテナーに適用できることに注意してください。
次のサンプルコードは、対応するバックインサーターイテレーターを自動的に構築する std::back_inserter
関数を使用して、std::fill_n
アルゴリズムを vector
コンテナーに適用する方法を示しています。
#include <iostream>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printRange(std::vector<T> v) {
for (const auto &item : v) {
cout << item << "; ";
}
cout << endl;
}
int main() {
vector<int> v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::fill_n(std::back_inserter(v1), 2, 100);
cout << "v1: ";
printRange(v1);
return EXIT_SUCCESS;
}
出力:
v1: 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 100; 100;
std::back_inserter
と std::set_intersection
アルゴリズムの併用
または、std::back_inserter
と std::set_intersection
アルゴリズムを使用して、サイズを事前に予約せずに、2つのコレクションの要素を宛先コンテナーに格納することもできます。次のコードスニペットでは、メソッドを std::vector
コンテナに適用します。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printRange(std::vector<T> v) {
for (const auto &item : v) {
cout << item << "; ";
}
cout << endl;
}
int main() {
vector<int> v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
vector<int> v2 = {1, 2, 3, 4};
vector<int> v3;
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
std::back_inserter(v3));
cout << "v3: ";
printRange(v3);
return EXIT_SUCCESS;
}
出力:
v3: 1; 2; 3; 4;
さらに、後者は STL コンテナインターフェイスを実装するため、back_inserter
を string
オブジェクトとともに使用できます。したがって、std::set_union
アルゴリズムを使用して、文字列の一部を別の文字列オブジェクトに追加できます。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string s1("hello");
string s2("there");
string s3;
std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::back_inserter(s3));
cout << s3 << endl;
return EXIT_SUCCESS;
}
出力:
hellothere