C++ で STL セットコンテナを使用する
-
C++ で
std::set
を使用して SetContainerObject を宣言する -
insert
メンバー関数を使用して、C++ のセットに要素を挿入する -
C++ で
find
メンバー関数を使用して指定されたキーを持つ要素のイテレータを取得する -
contains
メンバー関数を使用して、指定されたキーを持つ要素が C++ のセットに存在するかどうかを確認する
この記事では、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