最終更新日時(UTC): 2026年02月17日 14時22分33秒
Akira Takahashi が更新

履歴 編集

function
<set>

# std::set::find

    iterator find(const key_type& x);           // (1) C++03
    constexpr iterator find(const key_type& x); // (1) C++26

    template <class K>
    iterator find(const K& x);           // (2) C++14
    template <class K>
    constexpr iterator find(const K& x); // (2) C++26

    const_iterator find(const key_type& x) const;           // (3) C++03
    constexpr const_iterator find(const key_type& x) const; // (3) C++26

    template <class K>
    const_iterator find(const K& x) const;           // (4) C++14
    template <class K>
    constexpr const_iterator find(const K& x) const; // (4) C++26

## 概要

`x`と等価なキーの要素を検索する。

- (1), (3) : クラスのテンプレートパラメータ`key_type`型のキーを受け取って検索する。
- (2), (4) : `key_type`と比較可能な`K`型のキーを受け取って検索する。

## テンプレートパラメータ制約

- (2), (4) : `key_compare::is_transparent`が妥当な式であること

## 戻り値

- (1), (3) : `x`と等価なキーの要素が見つかった場合は、見つかった要素へのイテレータを返す。そうでない場合は、 `end()` を返す。
- (2), (4) : `key_compare`型の関数オブジェクトを`c`、コンテナ内の各要素が持つキーを`k`として、キーが等価か判定する式`!c(k, x) && !c(x, k)`が`true`となる要素へのイテレータを返す。そのような要素がない場合は、`end()` を返す。

## 計算量

`size()` について対数時間。

## 備考

- (2), (4) :
  - `is_transparent`は、標準ライブラリの`std::less`、`std::greater`といった関数オブジェクトの、`void`に対する特殊化で定義される。それ以外のテンプレートパラメータで`is_transparent`が定義されないのは、互換性のためである。
  - これらのオーバーロードは、`set<string>`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。

## 例

    #include <iostream>
    #include <set>
    #include <string>

    int main()
    {
      // (1)
      {
        std::set<std::string> s = { "Alice", "Bob", "Carol" };

        decltype(s)::iterator it = s.find("Bob");
        if (it != s.end()) { // 見つかった
          std::cout << *it << std::endl;
        }
      }

      // (2)
      {
        std::set<std::string, std::less<>> s = { "Alice", "Bob", "Carol" };

        // std::lessのvoidに対する特殊化を使用することで、
        // 文字列リテラルをfind()関数の引数として渡した際に、
        // std::string型の一時オブジェクトが生成されない。
        decltype(s)::iterator it = s.find("Bob");
        if (it != s.end()) { // 見つかった
          std::cout << *it << std::endl;
        }
      }
    }

### 出力

    Bob
    Bob

## 関連項目

名前 | 説明
--- | ---
`count` | 指定したキーにマッチする要素の数を返す
`lower_bound` | 与えられた値より小さくない要素へのイテレータを返す
`upper_bound` | 特定の値よりも大きい最初の要素へのイテレータを返す

## 参照

- N3657 Adding heterogeneous comparison lookup to associative containers (rev 4)
- LWG Issue 2299. [CD] Effects of inaccessible `key_compare::is_transparent` type are not clear
- P3372R3 constexpr containers and adaptors