std::set
| ヘッダー <set> で定義 |
||
| template< class Key, |
(1) | |
| namespace pmr { template< |
(2) | (C++17以降) |
std::setは、Key型のユニークなオブジェクトのソート済み集合を格納する連想コンテナである。ソートはキー比較関数Compareを用いて行われる。検索、削除、挿入の操作は対数計算量を持つ。setは通常、赤黒木として実装される。
標準ライブラリがCompare要件を使用するあらゆる場所で、一意性(uniqueness)は同値関係(equivalence relation)を用いて決定される。厳密ではない言い方をすれば、2つのオブジェクトaとbは、どちらも他方より小さいと見なされない場合、つまり!comp(a, b) && !comp(b, a)の場合に同値であると見なされる。
std::setは、Container、AllocatorAwareContainer、AssociativeContainer、そしてReversibleContainerの要件を満たす。
|
|
(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以降) |
コンテナのノードを表す ノードハンドル の特殊化 | ||||
insert_return_type (C++17 以降) |
node_type の挿入結果を記述する型。以下の特殊化であるtemplate<class Iter, class NodeType> |
[編集] メンバ関数
setを構築する(公開メンバ関数) | |
setを破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| 関連付けられたアロケータを返す (公開メンバ関数) | |
イテレータ | |
| (C++11) |
先頭へのイテレータを返す (public メンバ関数) |
| (C++11) |
末尾へのイテレータを返す (public メンバ関数) |
| (C++11) |
先頭への逆イテレータを返す (public メンバ関数) |
| (C++11) |
末尾への逆イテレータを返す (public メンバ関数) |
容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| 可能な最大要素数を返す (public メンバ関数) | |
変更 | |
| 内容をクリアする (公開メンバ関数) | |
| 要素 またはノード(C++17以降)を挿入する (公開メンバ関数) | |
| (C++23) |
要素の範囲を挿入する (公開メンバ関数) |
| (C++11) |
要素を直接構築する (公開メンバ関数) |
| (C++11) |
ヒントを使用して要素を直接構築する (公開メンバ関数) |
| 要素を削除する (公開メンバ関数) | |
| 内容を交換する (public メンバ関数) | |
| (C++17) |
コンテナからノードを抽出する (公開メンバ関数) |
| (C++17) |
他のコンテナからノードを連結する (公開メンバ関数) |
検索 | |
| 特定のキーに一致する要素の数を返す (公開メンバ関数) | |
| 特定のキーを持つ要素を検索する (公開メンバ関数) | |
| (C++20) |
コンテナが特定のキーを持つ要素を含むか確認する (公開メンバ関数) |
| 特定のキーに一致する要素の範囲を返す (公開メンバ関数) | |
| 指定されたキーより小さくない最初の要素へのイテレータを返す (公開メンバ関数) | |
| 指定されたキーより大きい最初の要素へのイテレータを返す (公開メンバ関数) | |
監視 | |
| キーを比較する関数を返す (公開メンバ関数) | |
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つの型をパラメータ型として使用する関数オーバーロードのペアを定義すると、ODR (One Definition Rule) に違反する可能性があることを意味する。iterator は const_iterator に変換可能なので、代わりに const_iterator をパラメータ型として持つ単一の関数が機能する。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | コンテナのRangeコンストラクタとRange挿入 |
__cpp_lib_constexpr_containers |
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) |
ユニークなキーのコレクションを提供するためにコンテナを適応させる、キーによってソートされる (class template) |