|
| 1 | +# find |
| 2 | +* flat_map[meta header] |
| 3 | +* std[meta namespace] |
| 4 | +* flat_map[meta class] |
| 5 | +* function[meta id-type] |
| 6 | +* cpp23[meta cpp] |
| 7 | + |
| 8 | +```cpp |
| 9 | +iterator find(const key_type& x); // (1) C++23 |
| 10 | + |
| 11 | +template <class K> |
| 12 | +iterator find(const K& x); // (2) C++23 |
| 13 | + |
| 14 | +const_iterator find(const key_type& x) const; // (3) C++23 |
| 15 | + |
| 16 | +template <class K> |
| 17 | +const_iterator find(const K& x) const; // (4) C++23 |
| 18 | +``` |
| 19 | +
|
| 20 | +## 概要 |
| 21 | +`x`と等価なキーの要素を検索する。 |
| 22 | +
|
| 23 | +- (1), (3) : クラスのテンプレートパラメータ`key_type`型のキーを受け取って検索する。 |
| 24 | +- (2), (4) : `key_type`と比較可能な`K`型のキーを受け取って検索する。 |
| 25 | +
|
| 26 | +
|
| 27 | +## テンプレートパラメータ制約 |
| 28 | +- (2), (4) : `key_compare::is_transparent`が妥当な式であること |
| 29 | +
|
| 30 | +
|
| 31 | +## 戻り値 |
| 32 | +- (1), (3) : `x`と等価なキーの要素が見つかった場合は、見つかった要素へのイテレータを返す。そうでない場合は、 [`end()`](end.md.nolink) を返す。 |
| 33 | +- (2), (4) : `key_compare`型の関数オブジェクトを`c`、コンテナ内の各要素が持つキーを`k`として、キーが等価か判定する式`!c(k, x) && !c(x, k)`が`true`となる要素へのイテレータを返す。そのような要素がない場合は、[`end()`](end.md.nolink) を返す。 |
| 34 | +
|
| 35 | +
|
| 36 | +## 計算量 |
| 37 | +[`size`](size.md.nolink) について対数時間。 |
| 38 | +
|
| 39 | +
|
| 40 | +## 備考 |
| 41 | +- (2), (4) : |
| 42 | + - `is_transparent`は、標準ライブラリの[`std::less`](/reference/functional/less.md)、[`std::greater`](/reference/functional/greater.md)といった関数オブジェクトの、`void`に対する特殊化で定義される。それ以外のテンプレートパラメータで`is_transparent`が定義されないのは、互換性のためである。 |
| 43 | + - これらのオーバーロードは、`map<string, int>`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。 |
| 44 | +
|
| 45 | +
|
| 46 | +## 例 |
| 47 | +```cpp example |
| 48 | +#include <iostream> |
| 49 | +#include <flat_map> |
| 50 | +#include <string> |
| 51 | +
|
| 52 | +int main() |
| 53 | +{ |
| 54 | + // (1) |
| 55 | + { |
| 56 | + std::flat_map<std::string, int> fm = { |
| 57 | + {"Alice", 3}, |
| 58 | + {"Bob", 1}, |
| 59 | + {"Carol", 4} |
| 60 | + }; |
| 61 | +
|
| 62 | + decltype(fm)::iterator it = fm.find("Bob"); |
| 63 | + if (it != fm.end()) { // 見つかった |
| 64 | + std::cout << it->second << std::endl; |
| 65 | + } |
| 66 | + } |
| 67 | +
|
| 68 | + // (2) |
| 69 | + { |
| 70 | + std::flat_map<std::string, int, std::less<>> fm = { |
| 71 | + {"Alice", 3}, |
| 72 | + {"Bob", 1}, |
| 73 | + {"Carol", 4} |
| 74 | + }; |
| 75 | +
|
| 76 | + // std::lessのvoidに対する特殊化を使用することで、 |
| 77 | + // 文字列リテラルをfind()関数の引数として渡した際に、 |
| 78 | + // std::string型の一時オブジェクトが生成されない。 |
| 79 | + decltype(fm)::iterator it = fm.find("Bob"); |
| 80 | + if (it != fm.end()) { // 見つかった |
| 81 | + std::cout << it->second << std::endl; |
| 82 | + } |
| 83 | + } |
| 84 | +} |
| 85 | +``` |
| 86 | +* find[color ff0000] |
| 87 | +* std::less[link /reference/functional/less.md] |
| 88 | + |
| 89 | +### 出力 |
| 90 | +``` |
| 91 | +1 |
| 92 | +1 |
| 93 | +``` |
| 94 | + |
| 95 | +## 関連項目 |
| 96 | +- [`contains()`](contains.md.nolink) |
| 97 | + |
0 commit comments