Namespaces
Variants

std:: set

From ja.cppreference.net
ヘッダーで定義 <set>
template <

class Key,
class Compare = std:: less < Key > ,
class Allocator = std:: allocator < Key >

> class set ;
(1)
namespace pmr {

template <
class Key,
class Compare = std:: less < Key >
> using set = std :: set < Key, Compare, std:: pmr :: polymorphic_allocator < Key >> ;

}
(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 オブジェクトを作成および使用することが可能です。

ただし、 std::set オブジェクト自体は一般的に constexpr にはできません。なぜなら、動的に割り当てられたストレージは同じ定数式の評価内で解放されなければならないためです。

(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

Allocator::pointer

(C++11まで)

std::allocator_traits<Allocator>::pointer

(C++11以降)
const_pointer

Allocator::const_pointer

(C++11まで)

std::allocator_traits<Allocator>::const_pointer

(C++11以降)
iterator 定数 LegacyBidirectionalIterator および ConstexprIterator(C++26以降) から value_type
const_iterator LegacyBidirectionalIterator および ConstexprIterator(C++26以降) から const value_type
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 >
struct /* unspecified */
{
    Iter     position;
    bool     inserted;
    NodeType node;
};

テンプレート引数でインスタンス化された iterator および node_type。

メンバー関数

setを構築する
(public member function)
setを破棄する
(public member function)
コンテナに値を代入する
(公開メンバ関数)
関連付けられたアロケータを返す
(public member function)
イテレータ
先頭を指すイテレータを返す
(公開メンバ関数)
(C++11)
終端へのイテレータを返す
(公開メンバ関数)
先頭を指す逆方向イテレータを返す
(公開メンバ関数)
(C++11)
末尾を指す逆方向イテレータを返す
(公開メンバ関数)
容量
コンテナが空かどうかをチェックする
(公開メンバ関数)
要素数を返す
(公開メンバ関数)
格納可能な最大要素数を返す
(公開メンバ関数)
修飾子
内容をクリアする
(公開メンバー関数)
要素を挿入する またはノード (C++17以降)
(公開メンバ関数)
要素の範囲を挿入する
(公開メンバ関数)
(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++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++23)
コンテナをアダプトして一意のキーのコレクションを提供、キーでソート
(クラステンプレート)