最終更新日時:
が更新

履歴 編集

function
<map>

std::map::lookup(C++29)

constexpr optional<mapped_type&> lookup(const key_type& x);             // (1) C++29
constexpr optional<const mapped_type&> lookup(const key_type& x) const; // (2) C++29

template <class K>
constexpr optional<mapped_type&> lookup(const K& x);                    // (3) C++29

template <class K>
constexpr optional<const mapped_type&> lookup(const K& x) const;        // (4) C++29

概要

指定したキーを持つ要素を検索し、対応する値への参照をstd::optionalとして取得する。キーに対応する要素が存在しない場合は無効値を返す。

operator[]と違ってコンテナが変更されることはなく、at()と違って例外も送出されない。キーが存在しない場合の代替値は、戻り値に対してvalue_or()などで簡潔に指定できる。

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

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

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

事前条件

  • find(x)が妥当な式であり、定義された動作をすること

戻り値

contains(x)trueであればfind(x)->secondへの参照を保持するoptionalオブジェクトを返し、そうでなければ無効値を返す。

計算量

要素数に対して対数時間

備考

  • 戻り値の型は、C++26で追加された参照に対するoptionalstd::optional<T&>)である
  • (3), (4) :
    • これらのオーバーロードは、map<string, int>のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある

#include <map>
#include <iostream>
#include <optional>
#include <string>

int main()
{
  std::map<std::string, int> m = {{"Alice", 3}, {"Bob", 1}};

  // キーが存在すれば対応する値を、存在しなければ代替値0を取得する
  std::cout << m.lookup("Alice").value_or(0) << std::endl;
  std::cout << m.lookup("Carol").value_or(0) << std::endl;

  // 参照を通じて要素を書き換えることもできる
  if (auto v = m.lookup("Bob")) {
    *v = 10;
  }
  std::cout << m.at("Bob") << std::endl;
}

このコードはC++29の規則のもとでは適格だが、2026年9月時点で本関数を実装した処理系はない。

出力

3
0
10

バージョン

言語

  • C++29

処理系

関連項目

参照