From fb295e5dead94487ffcc86042b541ab62e3cb068 Mon Sep 17 00:00:00 2001 From: Akira Takahashi Date: Tue, 13 Jun 2023 16:00:58 +0900 Subject: [PATCH] =?UTF-8?q?flat=5Fmap=20:=20emplace=5Fhint=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20#1078?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/flat_map/flat_map.md | 2 +- reference/flat_map/flat_map/emplace.md | 2 +- reference/flat_map/flat_map/emplace_hint.md | 82 +++++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 reference/flat_map/flat_map/emplace_hint.md diff --git a/reference/flat_map/flat_map.md b/reference/flat_map/flat_map.md index 18628ef35..779e4536b 100644 --- a/reference/flat_map/flat_map.md +++ b/reference/flat_map/flat_map.md @@ -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 | diff --git a/reference/flat_map/flat_map/emplace.md b/reference/flat_map/flat_map/emplace.md index f822e8ec7..398b43084 100644 --- a/reference/flat_map/flat_map/emplace.md +++ b/reference/flat_map/flat_map/emplace.md @@ -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) | キーが存在しない場合のみ要素を直接構築する | diff --git a/reference/flat_map/flat_map/emplace_hint.md b/reference/flat_map/flat_map/emplace_hint.md new file mode 100644 index 000000000..113abdf27 --- /dev/null +++ b/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 +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 +#include + +int main() +{ + std::flat_map 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) | キーが存在しない場合のみ要素を直接構築する | +