Skip to content

Commit

Permalink
flat_map : containsとcountを追加 #1078
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed May 25, 2023
1 parent d6e40dd commit d91c1da
Show file tree
Hide file tree
Showing 10 changed files with 193 additions and 4 deletions.
6 changes: 4 additions & 2 deletions reference/flat_map/flat_map.md
Expand Up @@ -76,9 +76,9 @@ 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 |
| [`count`](flat_map/count.md) | 指定したキーにマッチする要素の数を取得する | C++23 |
| [`find`](flat_map/find.md) | 指定したキーで要素を探す | C++23 |
| [`contains`](flat_map/contains.md.nolink) | 指定したキーの要素が含まれているかを判定する | C++23 |
| [`contains`](flat_map/contains.md) | 指定したキーの要素が含まれているかを判定する | C++23 |
| [`equal_range`](flat_map/equal_range.md.nolink) | 指定したキーにマッチする要素範囲を取得する | C++23 |
| [`lower_bound`](flat_map/lower_bound.md.nolink) | 与えられた値より小さくない最初の要素へのイテレータを取得する | C++23 |
| [`upper_bound`](flat_map/upper_bound.md.nolink) | 特定の値よりも大きい最初の要素へのイテレータを取得する | C++23 |
Expand All @@ -89,6 +89,8 @@ namespace std {
|-------------------------------------|----------------------------------------|----------------|
| [`key_comp`](flat_map/key_comp.md.nolink) | キー比較用の関数オブジェクトを取得する | C++23 |
| [`value_comp`](flat_map/value_comp.md.nolink) | 要素比較用の関数オブジェクトを取得する | C++23 |
| [`keys`](flat_map/keys.md.nolink) | キーのコンテナを取得する | C++23 |
| [`values`](flat_map/values.md.nolink) | 値のコンテナを取得する | C++23 |
## メンバ型
Expand Down
74 changes: 74 additions & 0 deletions reference/flat_map/flat_map/contains.md
@@ -0,0 +1,74 @@
# contains
* flat_map[meta header]
* std[meta namespace]
* flat_map[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
bool contains(const key_type& x) const; // (1) C++23

template <class K>
bool contains(const K& x) const; // (2) C++23
```
## 概要
指定されたキー`x`に一致する要素がコンテナに含まれているかを判定する。
- (1) : クラスのテンプレートパラメータ`key_type`型のキーを受け取る
- (2) : `key_type`と比較可能な`K`型のキーを受け取る
## 戻り値
以下と等価:
```cpp
return find(x) != end();
```
* find[link find.md]
* end()[link end.md.nolink]


## 計算量
対数時間


##
```cpp example
#include <iostream>
#include <flat_map>

int main()
{
std::flat_map<char, int> m = {
{'a', 3},
{'b', 1},
{'c', 4}
};

// キー'b'の要素が含まれているか
if (m.contains('b')) {
std::cout << "contain" << std::endl;
}
else {
std::cout << "doesn't contain" << std::endl;
}
}
```
* contains[color ff0000]

### 出力
```
contain
```


## バージョン
### 言語
- C++23

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): ??
- [Visual C++](/implementation.md#visual_cpp): ??
99 changes: 99 additions & 0 deletions reference/flat_map/flat_map/count.md
@@ -0,0 +1,99 @@
# count
* flat_map[meta header]
* std[meta namespace]
* flat_map[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
size_type count(const key_type& x) const; // (1) C++23

template <class K>
size_type count(const K& x) const; // (2) C++23
```
## 概要
キー `x` を検索し、コンテナ内に見つかった要素の数を返す。`flat_map` コンテナはキーの重複を許さないため、この関数は実際には要素が見つかったときに 1 を、そうでないときに 0 を返す。
- (1) : クラスのテンプレートパラメータ`key_type`型のキーを受け取る
- (2) : `key_type`と比較可能な`K`型のキーを受け取る
## 戻り値
- (1) : `x`と等価なキーの要素が見つかった場合は1、そうでない場合は0を返す。
- (2) : `key_compare`型の関数オブジェクトを`c`、コンテナ内の各要素が持つキーを`k`として、キーが等価か判定する式`!c(k, x) && !c(x, k)`が`true`となる要素が見つかった場合は1、そうでない場合は0を返す。
## 計算量
```
log(b.size()) + b.count(k)
```
* b.size()[link size.md]
## 備考
- (2) : この関数がオーバーロード解決に参加する条件は、[`find()`](find.md)メンバ関数の備考欄を参照
- [`std::flat_multimap`](/reference/flat_map/flat_multimap.md.nolink)クラスとの共通インタフェースを使用する必要がなければ、この関数の代わりに[`contains()`](contains.md)メンバ関数を使用することを推奨する
## 例
```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}
};
std::size_t n = fm.count("Bob");
if (n > 0) { // 見つかった
std::cout << "found" << std::endl;
}
}
// (2)
{
std::flat_map<std::string, int, std::less<>> fm = {
{"Alice", 3},
{"Bob", 1},
{"Carol", 4}
};
// std::lessのvoidに対する特殊化を使用することで、
// 文字列リテラルをcount()関数の引数として渡した際に、
// std::string型の一時オブジェクトが生成されない。
std::size_t n = fm.count("Bob");
if (n > 0) { // 見つかった
std::cout << "found" << std::endl;
}
}
}
```
* fm.count[color ff0000]
* std::less[link /reference/functional/less.md]

### 出力
```
found
found
```

## バージョン
### 言語
- C++23

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): ??
- [Visual C++](/implementation.md#visual_cpp): ??


## 関連項目
- [`contains()`](contains.md)
2 changes: 1 addition & 1 deletion reference/flat_map/flat_map/find.md
Expand Up @@ -104,5 +104,5 @@ int main()


## 関連項目
- [`contains()`](contains.md.nolink)
- [`contains()`](contains.md)

3 changes: 3 additions & 0 deletions reference/map/map/contains.md
Expand Up @@ -16,6 +16,9 @@ bool contains(const K& x) const; // (2)
## 概要
指定されたキー`x`に一致する要素がコンテナに含まれているかを判定する。
- (1) : クラスのテンプレートパラメータ`key_type`型のキーを受け取る
- (2) : `key_type`と比較可能な`K`型のキーを受け取る
## 戻り値
以下と等価:
Expand Down
3 changes: 2 additions & 1 deletion reference/map/map/count.md
Expand Up @@ -31,7 +31,8 @@ log(b.size()) + b.count(k)
## 備考
- (2) : この関数がオーバーロード解決に参加する条件は、[`find()`](find.md)メンバ関数の備考欄を参照。
- (2) : この関数がオーバーロード解決に参加する条件は、[`find()`](find.md)メンバ関数の備考欄を参照
- [`std::multimap`](/reference/map/multimap.md)クラスとの共通インタフェースを使用する必要がなければ、この関数の代わりに[`contains()`](contains.md)メンバ関数を使用することを推奨する
## 例
Expand Down
3 changes: 3 additions & 0 deletions reference/map/multimap/contains.md
Expand Up @@ -16,6 +16,9 @@ bool contains(const K& x) const; // (2)
## 概要
指定されたキー`x`に一致する要素がコンテナに含まれているかを判定する。
- (1) : クラスのテンプレートパラメータ`key_type`型のキーを受け取る
- (2) : `key_type`と比較可能な`K`型のキーを受け取る
## 戻り値
以下と等価:
Expand Down
3 changes: 3 additions & 0 deletions reference/set/multiset/contains.md
Expand Up @@ -16,6 +16,9 @@ bool contains(const K& x) const; // (2)
## 概要
指定されたキー`x`に一致する要素がコンテナに含まれているかを判定する。
- (1) : クラスのテンプレートパラメータ`key_type`型のキーを受け取る
- (2) : `key_type`と比較可能な`K`型のキーを受け取る
## 戻り値
以下と等価:
Expand Down
1 change: 1 addition & 0 deletions reference/set/multiset/count.md
Expand Up @@ -32,6 +32,7 @@ log(b.size()) + b.count(k)
## 備考
- (2) : この関数がオーバーロード解決に参加する条件は、[`find()`](find.md)メンバ関数の備考欄を参照。
- [`std::multiset`](/reference/set/multiset.md)クラスとの共通インタフェースを使用する必要がなければ、この関数の代わりに[`contains()`](contains.md)メンバ関数を使用することを推奨する
## 例
Expand Down
3 changes: 3 additions & 0 deletions reference/set/set/contains.md
Expand Up @@ -16,6 +16,9 @@ bool contains(const K& x) const; // (2)
## 概要
指定されたキー`x`に一致する要素がコンテナに含まれているかを判定する。
- (1) : クラスのテンプレートパラメータ`key_type`型のキーを受け取る
- (2) : `key_type`と比較可能な`K`型のキーを受け取る
## 戻り値
以下と等価:
Expand Down

0 comments on commit d91c1da

Please sign in to comment.