C++ の std::back_inserter 関数テンプレート

胡金庫 2023年10月12日
  1. std::back_inserter を使用して、コンテナーの最後に要素を追加するイテレーターを作成する
  2. std::back_inserterstd::set_intersection アルゴリズムの併用
C++ の std::back_inserter 関数テンプレート

この記事では、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_inserterstd::set_intersection アルゴリズムの併用

または、std::back_inserterstd::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_inserterstring オブジェクトとともに使用できます。したがって、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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Iterator