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で追加された参照に対する
optional(std::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
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??
関連項目
参照
- P3091R6 Better Lookups for
map,unordered_map, andflat_map - P4139R3 Better Name for Better Lookups in P3091
- 当初
getという名前で提案されていたが、この提案の議論によりlookupに変更された
- 当初