Namespaces
Variants

std:: set

From 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 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 >
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)
コンテナをアダプトして一意のキーのコレクションを提供、キーでソート
(クラステンプレート)