C++ で STL セットコンテナを使用する

胡金庫 2023年10月12日
  1. C++ で std::set を使用して SetContainerObject を宣言する
  2. insert メンバー関数を使用して、C++ のセットに要素を挿入する
  3. C++ で find メンバー関数を使用して指定されたキーを持つ要素のイテレータを取得する
  4. contains メンバー関数を使用して、指定されたキーを持つ要素が C++ のセットに存在するかどうかを確認する
C++ で STL セットコンテナを使用する

この記事では、C++ で STL set コンテナーを使用する方法に関する複数の方法を示します。

C++ で std::set を使用して SetContainerObject を宣言する

std::set コマンドは、ソートされた一意のオブジェクトのセットを連想コンテナとして実装します。要素はデフォルトで std::less 比較関数でソートされますが、ユーザーは 2 番目のテンプレート引数としてカスタム関数を指定できます。同じヘッダーは、重複をフィルタリングせずに複数の値を格納できる std::multiset コンテナも提供します。

次の例では、イニシャライザリストコンストラクタを使用して両方のセットオブジェクトを作成することに注意してください。また、count メンバー関数を利用します。この関数は、指定されたキーを持つセットに存在する要素の数を取得します。この関数は std::multiset コンテナに固有のものですが、std::set オブジェクトから呼び出されたときに同じ関数で要素が存在するかどうかを確認できます。

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

template <typename T>
void printSet(set<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

template <typename T>
void printMultiSet(multiset<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

#define STR(num) #num

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};
  printSet(s1);

  std::multiset<int> s2 = {1, 1, 1, 2, 2, 3};
  printMultiSet(s2);
  std::cout << STR(s2) << " contains " << s2.count(1) << "ones" << endl;
  std::cout << STR(s2) << " contains " << s2.count(2) << "twos" << endl;

  return EXIT_SUCCESS;
}

出力:

1; 2; 3;
1; 1; 1; 2; 2; 3;
s2 contains 3 ones
s2 contains 2 twos

insert メンバー関数を使用して、C++ のセットに要素を挿入する

insert 関数には複数のオーバーロードがありますが、セットに追加される要素を表す単一の引数を取るバージョンを利用します。この insert のオーバーロードは、イテレータの std::pair オブジェクトと bool を返します。

後者は、挿入が成功したかどうかを示し、成功した場合は、true の値を持ちます。一方、イテレータは、操作が成功すると、挿入された要素を指します。失敗した場合は、挿入を妨げた要素を指します。挿入操作には、コンテナーのサイズが対数的に複雑であることに注意してください。

#include <cassert>
#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto ret = s1.insert(5);
  assert(*ret.first == 5);
  if (ret.second) std::cout << "Inserted!" << endl;

  ret = s1.insert(1);
  assert(*ret.first == 1);
  if (!ret.second) std::cout << "Not inserted!" << endl;

  return EXIT_SUCCESS;
}

出力:

Inserted!
Not inserted!

C++ で find メンバー関数を使用して指定されたキーを持つ要素のイテレータを取得する

find 関数は、std::set コンテナのもう 1つの便利なメンバー関数であり、指定されたキーを持つ要素にイテレータを返すことができます。セットにそのような要素がない場合は、過去のイテレータが返されます。これは、ユーザーが関数呼び出しが成功したことを確認するのに役立ちます。

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto search = s1.find(2);
  if (search != s1.end()) {
    cout << "Found " << (*search) << endl;
  } else {
    cout << "Not found" << endl;
  }

  return EXIT_SUCCESS;
}

出力:

Found 2

contains メンバー関数を使用して、指定されたキーを持つ要素が C++ のセットに存在するかどうかを確認する

C++ 20 言語標準以降、std::set はメンバー関数 contains を提供します。これは、指定されたキーを持つ要素が set オブジェクトに存在するかどうかを確認するためのより簡単なインターフェイスです。この関数はブール値を返し、そのような要素がセットに存在するかどうかを示します。この関数の実行時間の複雑さも、コンテナーのサイズの対数です。

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s3 = {91, 123, 63, 122, 22, 53};

  for (int x : {22, 23, 53, 54}) {
    if (s3.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

出力:

22: Found
23: Not found
53: Found
54: Not found
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Set