diff --git a/reference/flat_map/flat_map.md b/reference/flat_map/flat_map.md index ce2f36f48..66257675a 100644 --- a/reference/flat_map/flat_map.md +++ b/reference/flat_map/flat_map.md @@ -77,7 +77,7 @@ namespace std { | [`operator[]`](flat_map/op_at.md) | 指定したキーを持つ要素を取得する | C++23 | | [`at`](flat_map/at.md) | 指定したキーを持つ要素を取得する | C++23 | | [`count`](flat_map/count.md.nolink) | 指定したキーにマッチする要素の数を取得する | C++23 | -| [`find`](flat_map/find.md.nolink) | 指定したキーで要素を探す | C++23 | +| [`find`](flat_map/find.md) | 指定したキーで要素を探す | C++23 | | [`contains`](flat_map/contains.md.nolink) | 指定したキーの要素が含まれているかを判定する | C++23 | | [`equal_range`](flat_map/equal_range.md.nolink) | 指定したキーにマッチする要素範囲を取得する | C++23 | | [`lower_bound`](flat_map/lower_bound.md.nolink) | 与えられた値より小さくない最初の要素へのイテレータを取得する | C++23 | diff --git a/reference/flat_map/flat_map/at.md b/reference/flat_map/flat_map/at.md index 593666b50..00317087d 100644 --- a/reference/flat_map/flat_map/at.md +++ b/reference/flat_map/flat_map/at.md @@ -95,4 +95,4 @@ exception std::out_of_range ## 関連項目 - [`operator[]`](op_at.md) -- [`find()`](find.md.nolink) +- [`find()`](find.md) diff --git a/reference/flat_map/flat_map/find.md b/reference/flat_map/flat_map/find.md new file mode 100644 index 000000000..81be7eaa7 --- /dev/null +++ b/reference/flat_map/flat_map/find.md @@ -0,0 +1,97 @@ +# find +* flat_map[meta header] +* std[meta namespace] +* flat_map[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +iterator find(const key_type& x); // (1) C++23 + +template +iterator find(const K& x); // (2) C++23 + +const_iterator find(const key_type& x) const; // (3) C++23 + +template +const_iterator find(const K& x) const; // (4) C++23 +``` + +## 概要 +`x`と等価なキーの要素を検索する。 + +- (1), (3) : クラスのテンプレートパラメータ`key_type`型のキーを受け取って検索する。 +- (2), (4) : `key_type`と比較可能な`K`型のキーを受け取って検索する。 + + +## テンプレートパラメータ制約 +- (2), (4) : `key_compare::is_transparent`が妥当な式であること + + +## 戻り値 +- (1), (3) : `x`と等価なキーの要素が見つかった場合は、見つかった要素へのイテレータを返す。そうでない場合は、 [`end()`](end.md.nolink) を返す。 +- (2), (4) : `key_compare`型の関数オブジェクトを`c`、コンテナ内の各要素が持つキーを`k`として、キーが等価か判定する式`!c(k, x) && !c(x, k)`が`true`となる要素へのイテレータを返す。そのような要素がない場合は、[`end()`](end.md.nolink) を返す。 + + +## 計算量 +[`size`](size.md.nolink) について対数時間。 + + +## 備考 +- (2), (4) : + - `is_transparent`は、標準ライブラリの[`std::less`](/reference/functional/less.md)、[`std::greater`](/reference/functional/greater.md)といった関数オブジェクトの、`void`に対する特殊化で定義される。それ以外のテンプレートパラメータで`is_transparent`が定義されないのは、互換性のためである。 + - これらのオーバーロードは、`map`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。 + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + // (1) + { + std::flat_map fm = { + {"Alice", 3}, + {"Bob", 1}, + {"Carol", 4} + }; + + decltype(fm)::iterator it = fm.find("Bob"); + if (it != fm.end()) { // 見つかった + std::cout << it->second << std::endl; + } + } + + // (2) + { + std::flat_map> fm = { + {"Alice", 3}, + {"Bob", 1}, + {"Carol", 4} + }; + + // std::lessのvoidに対する特殊化を使用することで、 + // 文字列リテラルをfind()関数の引数として渡した際に、 + // std::string型の一時オブジェクトが生成されない。 + decltype(fm)::iterator it = fm.find("Bob"); + if (it != fm.end()) { // 見つかった + std::cout << it->second << std::endl; + } + } +} +``` +* find[color ff0000] +* std::less[link /reference/functional/less.md] + +### 出力 +``` +1 +1 +``` + +## 関連項目 +- [`contains()`](contains.md.nolink) +