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

履歴 編集

function
<unordered_map>

# std::unordered_map::operator[](C++11)

    T& operator[](const key_type& x);           // (1) C++11
    constexpr T& operator[](const key_type& x); // (1) C++26

    T& operator[](key_type&& x);           // (2) C++11
    constexpr T& operator[](key_type&& x); // (2) C++26

    template <class K>
    constexpr T& operator[](K&& k); // (3) C++26

## 概要

要素へのアクセス。

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

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

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

## 戻り値

キー`x`に対応する値を返す。対応する要素が存在しない場合は、要素を値初期化して参照を返す。

## 例外

ハッシュ関数以外から例外が投げられた場合には、対応する要素がない場合の新規要素の挿入処理は実施されない。

## 計算量

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

## 備考

- (3) :
  - `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) {

      std::cout << "{" << c[v] << "}" << std::endl;
    }

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

      std::cout << "size=" << um.size() << std::endl;

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

      std::cout << "size=" << um.size() << std::endl;

      return 0;
    }

### 出力

    size=1
    {a}
    {}
    size=2

## バージョン

### 言語

- C++11

### 処理系

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

## 関連項目

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

## 参照

- P2363R5 Extending associative containers with the remaining heterogeneous overloads
  - C++26で`template <class K>`のバージョンが追加された
- P3372R3 constexpr containers and adaptors