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

履歴 編集

function
<unordered_map>

# std::unordered_map::at(C++11)

    T& at(const key_type& x);           // (1) C++11
    constexpr T& at(const key_type& x); // (1) C++26

    const T& at(const key_type& x) const;           // (2) C++11
    constexpr const T& at(const key_type& x) const; // (2) C++26

    template<class K>
    constexpr T& at(const K& x); // (3) C++26

    template<class K>
    constexpr const T& at(const K& x) const; // (4) C++26

## 概要

参照のためのメソッドで、取り出す時にキーの存在チェックをする。

- (1), (2) : クラスのテンプレートパラメータ`key_type`型のキーに対応する要素を取得する
- (3), (4) : `key_type`と比較可能な`K`型のキーに対応する要素を取得する

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

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

## 事前条件

- (3), (4) : `find(x)`が妥当な式であり、定義された動作をすること

## 戻り値

キー`x`に対応する値を返す。

## 例外

- 指定されたキーに対応する要素が存在しない場合、`std::out_of_range` 例外を送出する

## 計算量

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

## 備考

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

## 例

    #include <iostream>
    #include <unordered_map>

    template<class Container, class T>
    void at_wrap(Container &c, T v) {

      try{
        std::cout << c.at(v) << std::endl;
      }
      catch(std::out_of_range&) {
        std::cout << "exception std::out_of_range" << std::endl;
      }
    }

    int main()
    {
      std::unordered_map<int, char> um;
      um.insert(std::make_pair(1,'a'));

      at_wrap(um, 1);
      at_wrap(um, 2);

      return 0;
    }

### 出力

    a
    exception std::out_of_range

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: 2012 ✅

## 関連項目

名前 | 説明
--- | ---
`operator=` | 代入演算子
`insert` | 要素を挿入する

## 参照

- LWG Issue 761. `unordered_map` needs an `at()` member function
- P2363R5 Extending associative containers with the remaining heterogeneous overloads
  - C++26で`template <class K>`のバージョンが追加された
- P3372R3 constexpr containers and adaptors