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

履歴 編集

function
<unordered_set>

# std::unordered_set::find(C++11)

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

    const_iterator find(const key_type& x) const;           // (2) C++11
    constexpr const_iterator find(const key_type& x) const; // (2) C++26

    template <class K> iterator find(const K& k);           // (3) C++20
    template <class K> constexpr iterator find(const K& k); // (3) C++26

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

## 概要

コンテナ内で指定されたキーに合致する要素を検索し、見つかった場合はそれへのイテレータを返し、見つからなかった場合は `end` （コンテナの最後の要素の次）を指すイテレータを返す。

- (1) : 非`const`な`*this`オブジェクトに対する検索
- (2) : `const`な`*this`オブジェクトに対する検索
- (3) : 非`const`な`*this`オブジェクトに対する透過的な検索
- (4) : `const`な`*this`オブジェクトに対する透過的な検索

(3), (4)の透過的な検索は、`Pred::is_transparent`および`Hash::is_transparent`が定義される場合に有効になる機能であり、例として`unordered_set<string> s;`に対して`s.find("key");`のように`string`型のキーを持つ連想コンテナの検索インタフェースに文字列リテラルを渡した際、`string`の一時オブジェクトが作られないようにできる。詳細は`std::hash`クラスのページを参照。

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

- (3), (4) : `Pred::is_transparent`型および`Hash::is_transparent`型が定義されていること

## 戻り値

指定されたキーと等価なキーの要素を指すイテレータを返す。そのような要素がない場合には、`end()`を返す。

## 計算量

- 平均： 定数時間
- 最悪： `size` について線形時間

## 備考

- コンテナが `const` の場合には `const_iterator`、そうでない場合には `iterator` が返るが、`unordered_set` の場合には、いずれにせよ読み取り専用イテレータである。

## 例

    #include <iostream>
    #include <unordered_set>
    #include <algorithm>
    #include <iterator>

    int main()
    {
      std::unordered_set<int> us{ 1, 3, 5, 7, 9, };

      std::copy(us.begin(), us.end(), std::ostream_iterator<int>(std::cout, ", "));
      std::cout << std::endl;

      auto it1 = us.find(5);
      if (it1 == us.end()) {
        std::cout << "not found" << std::endl;
      } else {
        std::cout << "found " << *it1 << " at " << std::distance(us.begin(), it1) << std::endl;
      }

      auto it2 = us.find(8);
      if (it2 == us.end()) {
        std::cout << "not found" << std::endl;
      } else {
        std::cout << "found " << *it2 << " at " << std::distance(us.begin(), it2) << std::endl;
      }
    }

### 出力例

    9, 7, 5, 3, 1,
    found 5 at 2
    not found

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.1 ✅
- GCC: 4.7.0 ✅
- ICC: ?
- Visual C++: ?

## 関連項目

名前 | 説明
--- | ---
`count` | 指定したキーの要素数を取得
`equal_range` | 指定したキーの範囲を取得

## 参照

- P0919R3 Heterogeneous lookup for unordered containers
- P3372R3 constexpr containers and adaptors