Skip to content

Commit

Permalink
flat_map : emplace_hintを追加 #1078
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed Jun 13, 2023
1 parent 90927bc commit fb295e5
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 2 deletions.
2 changes: 1 addition & 1 deletion reference/flat_map/flat_map.md
Expand Up @@ -62,7 +62,7 @@ namespace std {
| [`insert_or_assign`](flat_map/insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する | C++23 |
| [`insert_range`](flat_map/insert_range.md.nolink) | Rangeを挿入する | C++23 |
| [`emplace`](flat_map/emplace.md) | 要素を直接構築する | C++23 |
| [`emplace_hint`](flat_map/emplace_hint.md.nolink) | ヒントを使って要素を直接構築する | C++23 |
| [`emplace_hint`](flat_map/emplace_hint.md) | ヒントを使って要素を直接構築する | C++23 |
| [`try_emplace`](flat_map/try_emplace.md.nolink) | キーが存在しない場合のみ要素を直接構築する | C++23 |
| [`erase`](flaflat_maptmap/erase.md.nolink) | 要素を削除する | C++23 |
| [`swap`](flat_map/swap.md.nolink) | コンテンツを交換する | C++23 |
Expand Down
2 changes: 1 addition & 1 deletion reference/flat_map/flat_map/emplace.md
Expand Up @@ -134,6 +134,6 @@ CCC : (1, 2)
|------------------------------------------------|--------------------------------------------|
| [`flat_map::insert`](insert.md.nolink) | 要素を挿入する |
| [`flat_map::insert_or_assign`](insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する |
| [`flat_map::emplace_hint`](emplace_hint.md.nolink) | ヒントを使って要素を直接構築する |
| [`flat_map::emplace_hint`](emplace_hint.md) | ヒントを使って要素を直接構築する |
| [`flat_map::try_emplace`](try_emplace.md.nolink) | キーが存在しない場合のみ要素を直接構築する |
82 changes: 82 additions & 0 deletions reference/flat_map/flat_map/emplace_hint.md
@@ -0,0 +1,82 @@
# emplace_hint
* flat_map[meta header]
* std[meta namespace]
* flat_map[meta class]
* function template[meta id-type]
* cpp23[meta cpp]

```cpp
template <class... Args>
iterator emplace_hint(const_iterator hint, Args&&... args);
```
## 概要
要素が配置されるべき場所を示唆するパラメータ `hint` を使って、コンテナに新しい要素を挿入する。要素は直接構築される(コピーもムーブもされない)。要素のコンストラクタはこの関数に渡された引数と同じ引数で呼ばれる。
## パラメータ
- `hint` : 新しい要素をどこへ挿入するかを示唆するために使われるイテレータ
- `args...` : 要素のコンストラクタへ転送される引数パック
## 戻り値
新たな要素が追加された場合、その追加された要素を指すイテレータ。新たな要素が追加されなかった場合、既にあった要素を指すイテレータ。
## 計算量
一般にコンテナのサイズについて対数時間だが、新しい要素が `hint` の前に挿入された場合は償却定数時間。
## 備考
- [`try_emplace`](try_emplace.md.nolink) と異なり、たとえ要素が挿入されなかった場合でも `value_type` 型のオブジェクトが構築される可能性があり、結果として引数 `args` が [`move`](/reference/utility/move.md) の対象となって変更されてしまっている可能性があるため、注意が必要である。
## 例
```cpp example
#include <iostream>
#include <flat_map>
int main()
{
std::flat_map<int, char> fm;
fm.emplace(1, 'A');
// キー2の要素が最後尾に追加されることが事前にわかっているので、fm.end()をヒントとして与える
fm.emplace_hint(fm.end(), 2, 'B');
for (const auto& [key, value] : fm) {
std::cout << key << " : " << value << std::endl;
}
}
```
* emplace_hint[color ff0000]
* fm.emplace[link emplace.md]
* fm.end()[link end.md.nolink]

### 出力
```
1 : A
2 : B
```


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

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


## 関連項目

| 名前 | 説明 |
|------------------------------------------------|--------------------------------------------|
| [`flat_map::insert`](insert.md.nolink) | 要素を挿入する |
| [`flat_map::insert_or_assign`](insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する |
| [`flat_map::emplace`](emplace.md) | 要素を直接構築する |
| [`flat_map::try_emplace`](try_emplace.md.nolink) | キーが存在しない場合のみ要素を直接構築する |

0 comments on commit fb295e5

Please sign in to comment.