Skip to content

Commit

Permalink
flat_map : findを追加 #1078
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed May 18, 2023
1 parent 1702da3 commit a43bd16
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 2 deletions.
2 changes: 1 addition & 1 deletion reference/flat_map/flat_map.md
Expand Up @@ -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 |
Expand Down
2 changes: 1 addition & 1 deletion reference/flat_map/flat_map/at.md
Expand Up @@ -95,4 +95,4 @@ exception std::out_of_range

## 関連項目
- [`operator[]`](op_at.md)
- [`find()`](find.md.nolink)
- [`find()`](find.md)
97 changes: 97 additions & 0 deletions 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 <class K>
iterator find(const K& x); // (2) C++23

const_iterator find(const key_type& x) const; // (3) C++23

template <class K>
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<string, int>`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。
## 例
```cpp example
#include <iostream>
#include <flat_map>
#include <string>
int main()
{
// (1)
{
std::flat_map<std::string, int> 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<std::string, int, std::less<>> 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)

0 comments on commit a43bd16

Please sign in to comment.