std:: set
|
ヘッダーで定義
<set>
|
||
|
template
<
class
Key,
|
(1) | |
|
namespace
pmr
{
template
<
|
(2) | (C++17以降) |
std::set
は、型
Key
のユニークなオブジェクトを格納するソート済み連想コンテナです。ソートはキー比較関数
Compare
を使用して行われます。検索、削除、挿入操作の計算量は対数時間です。セットは通常
赤黒木
として実装されます。
標準ライブラリが Compare 要件を使用するすべての箇所では、一意性は同値関係を用いて決定されます。大まかに言えば、二つのオブジェクト a と b は、互いに他方より小さいと比較されない場合に同値と見なされます: ! comp ( a, b ) && ! comp ( b, a ) 。
std::set
は
Container
、
AllocatorAwareContainer
、
AssociativeContainer
および
ReversibleContainer
の要件を満たします。
std::setのすべてのメンバー関数は
std::set
は
constexpr
です:定数式の評価中に
std::set
オブジェクトを作成および使用することが可能です。
ただし、
|
(C++26以降) |
目次 |
テンプレートパラメータ
|
このセクションは不完全です
理由: テンプレートパラメータの説明を追加してください。 |
メンバー型
| 型 | 定義 | ||||
key_type
|
Key
|
||||
value_type
|
Key
|
||||
size_type
|
符号なし整数型(通常は std::size_t ) | ||||
difference_type
|
符号付き整数型(通常は std::ptrdiff_t ) | ||||
key_compare
|
Compare
|
||||
value_compare
|
Compare
|
||||
allocator_type
|
Allocator
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
value_type
への定数
LegacyBidirectionalIterator
および
ConstexprIterator
(C++26以降)
|
||||
const_iterator
|
const value_type への LegacyBidirectionalIterator および ConstexprIterator (C++26以降) | ||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > | ||||
node_type
(C++17以降)
|
コンテナノードを表す node handle の特殊化 | ||||
insert_return_type
(C++17以降)
|
node_type
の挿入結果を記述する型。
template
<
class
Iter,
class
NodeType
>
|
メンバー関数
set
を構築する
(public member function) |
|
set
を破棄する
(public member function) |
|
|
コンテナに値を代入する
(公開メンバ関数) |
|
|
関連付けられたアロケータを返す
(public member function) |
|
イテレータ |
|
|
(C++11)
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
(C++11)
|
終端へのイテレータを返す
(公開メンバ関数) |
|
(C++11)
|
先頭を指す逆方向イテレータを返す
(公開メンバ関数) |
|
(C++11)
|
末尾を指す逆方向イテレータを返す
(公開メンバ関数) |
容量 |
|
|
コンテナが空かどうかをチェックする
(公開メンバ関数) |
|
|
要素数を返す
(公開メンバ関数) |
|
|
格納可能な最大要素数を返す
(公開メンバ関数) |
|
修飾子 |
|
|
内容をクリアする
(公開メンバー関数) |
|
|
要素を挿入する
またはノード
(C++17以降)
(公開メンバ関数) |
|
|
(C++23)
|
要素の範囲を挿入する
(公開メンバ関数) |
|
(C++11)
|
要素をその場で構築する
(公開メンバ関数) |
|
(C++11)
|
ヒントを使用して要素をその場で構築する
(公開メンバ関数) |
|
要素を削除する
(公開メンバ関数) |
|
|
内容を交換する
(公開メンバ関数) |
|
|
(C++17)
|
コンテナからノードを抽出する
(公開メンバ関数) |
|
(C++17)
|
別のコンテナからノードをスプライスする
(公開メンバ関数) |
ルックアップ |
|
|
特定のキーに一致する要素の数を返す
(公開メンバ関数) |
|
|
特定のキーを持つ要素を検索
(public member function) |
|
|
(C++20)
|
指定されたキーを持つ要素がコンテナに含まれているかどうかをチェックします
(public member function) |
|
指定されたキーに一致する要素の範囲を返す
(公開メンバ関数) |
|
|
指定されたキーより
小さくない
最初の要素へのイテレータを返す
(公開メンバ関数) |
|
|
指定されたキーより
大きい
最初の要素へのイテレータを返す
(公開メンバ関数) |
|
オブザーバー |
|
|
キーを比較する関数を返す
(公開メンバ関数) |
|
value_type
型のオブジェクトにおけるキーを比較する関数を返す
(公開メンバ関数) |
|
非メンバー関数
|
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20)
|
2つの
set
の値を辞書順で比較する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++20)
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート) |
推論ガイド |
(C++17以降) |
注記
メンバ型
iterator
と
const_iterator
は同じ型のエイリアスである可能性があります。これは、これら2つの型をパラメータ型として使用する関数オーバーロードのペアを定義すると、
One Definition Rule
に違反する可能性があることを意味します。
iterator
は
const_iterator
に変換可能であるため、代わりに
const_iterator
をパラメータ型とする単一の関数が機能します。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | コンテナのためのレンジ構築と挿入 |
__cpp_lib_constexpr_set
|
202502L
|
(C++26) |
constexpr
std::set
|
例
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <set> #include <string_view> template<typename T> std::ostream& operator<<(std::ostream& out, const std::set<T>& set) { if (set.empty()) return out << "{}"; out << "{ " << *set.begin(); std::for_each(std::next(set.begin()), set.end(), [&out](const T& element) { out << ", " << element; }); return out << " }"; } int main() { std::set<int> set{1, 5, 3}; std::cout << set << '\n'; set.insert(2); std::cout << set << '\n'; set.erase(1); std::cout << set << "\n\n"; std::set<int> keys{3, 4}; for (int key : keys) { if (set.contains(key)) std::cout << set << " does contain " << key << '\n'; else std::cout << set << " doesn't contain " << key << '\n'; } std::cout << '\n'; std::string_view word = "element"; std::set<char> characters(word.begin(), word.end()); std::cout << "There are " << characters.size() << " unique characters in " << std::quoted(word) << ":\n" << characters << '\n'; }
出力:
{ 1, 3, 5 }
{ 1, 2, 3, 5 }
{ 2, 3, 5 }
{ 2, 3, 5 } does contain 3
{ 2, 3, 5 } doesn't contain 4
There are 5 unique characters in "element":
{ e, l, m, n, t }
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 103 | C++98 | イテレータがキーの変更を許可していた | イテレータを定数に変更 |
| LWG 230 | C++98 |
Key
が
CopyConstructible
であることが要求されていなかった
(
Key
型のキーが構築できない可能性があった)
|
Key
も
CopyConstructible であることが要求される |
関連項目
|
キーのコレクション、キーでソート
(クラステンプレート) |
|
|
(C++11)
|
一意のキーのコレクション、キーでハッシュ
(クラステンプレート) |
|
(C++23)
|
コンテナをアダプトして一意のキーのコレクションを提供、キーでソート
(クラステンプレート) |