From 0c072b9d3b702aad4920422e2fbb042c2e291019 Mon Sep 17 00:00:00 2001 From: Akira Takahashi Date: Wed, 16 Aug 2023 19:56:10 +0900 Subject: [PATCH] =?UTF-8?q?flat=5Fmap=20:=20insert=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=20#1078?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GLOBAL_QUALIFY_LIST.txt | 2 + reference/flat_map.md | 4 +- reference/flat_map/flat_map.md | 3 +- reference/flat_map/flat_map/at.md | 2 +- reference/flat_map/flat_map/emplace.md | 2 +- reference/flat_map/flat_map/emplace_hint.md | 2 +- reference/flat_map/flat_map/empty.md | 2 +- reference/flat_map/flat_map/erase.md | 2 +- reference/flat_map/flat_map/insert.md | 303 ++++++++++++++++++++ reference/flat_map/flat_map/key_equiv.md | 32 +++ reference/flat_map/flat_map/op_at.md | 2 +- reference/flat_map/flat_map/size.md | 2 +- reference/flat_map/flat_map/try_emplace.md | 4 +- reference/flat_map/sorted_unique_t.md | 66 +++++ reference/map/map/insert.md | 4 +- reference/map/multimap/insert.md | 2 +- 16 files changed, 420 insertions(+), 14 deletions(-) create mode 100644 reference/flat_map/flat_map/insert.md create mode 100644 reference/flat_map/flat_map/key_equiv.md create mode 100644 reference/flat_map/sorted_unique_t.md diff --git a/GLOBAL_QUALIFY_LIST.txt b/GLOBAL_QUALIFY_LIST.txt index 247d1a223a..e0b435e15e 100644 --- a/GLOBAL_QUALIFY_LIST.txt +++ b/GLOBAL_QUALIFY_LIST.txt @@ -107,6 +107,8 @@ * [link /reference/generator.md] * [link /reference/initializer_list.md] * std::initializer_list[link /reference/initializer_list/initializer_list.md] + * il.begin()[link /reference/initializer_list/initializer_list/begin.md] + * il.end()[link /reference/initializer_list/initializer_list/end.md] * [link /reference/iomanip.md] * [link /reference/ios.md] * std::boolalpha[link /reference/ios/boolalpha.md] diff --git a/reference/flat_map.md b/reference/flat_map.md index 7523236c44..1442c31cf1 100644 --- a/reference/flat_map.md +++ b/reference/flat_map.md @@ -17,7 +17,9 @@ | 名前 | 説明 | 対応バージョン | |----------------------------------------------|--------------------------------------------------------|-------| | [`flat_map`](flat_map/flat_map.md) | キーの重複を許さない平坦な順序付き連想コンテナ(class template) | C++23 | -| [`flat_multimap`](flat_map/flat_multimap.md.nolink) | キーの重複を許す平坦な順序付き連想コンテナ(class template) | C++23 | +| [`flat_multimap`](flat_map/flat_multimap.md.nolink) | キーの重複を許す平坦な順序付き連想コンテナ(class template) | C++23 | +| [`sorted_unique_t`](flat_map/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ型(class) | C++23 | +| [`sorted_unique`](flat_map/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ値(variable) | C++23 | ## バージョン diff --git a/reference/flat_map/flat_map.md b/reference/flat_map/flat_map.md index 498606679e..53e8f472eb 100644 --- a/reference/flat_map/flat_map.md +++ b/reference/flat_map/flat_map.md @@ -58,7 +58,7 @@ namespace std { | 名前 | 説明 | 対応バージョン | |-----------------------------------------------|--------------------------------------------|----------------| | [`clear`](flat_map/clear.md) | 全ての要素を削除する | C++23 | -| [`insert`](flat_map/insert.md.nolink) | 要素を挿入する | C++23 | +| [`insert`](flat_map/insert.md) | 要素を挿入する | C++23 | | [`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 | @@ -113,6 +113,7 @@ namespace std { | `key_container_type` | キーを格納するコンテナ型 `KeyContainer` | C++23 | | `mapped_container_type` | 値を格納するコンテナ型 `MappedContainer` | C++23 | | [`containers`](flat_map/containers.md) | キーのコンテナと値のコンテナを保持する型 | C++23 | +| [`key_equiv`](flat_map/key_equiv.md) | 要素をとってキーの等価比較を行う説明専用の関数オブジェクト | C++23 | ## 非メンバ関数 diff --git a/reference/flat_map/flat_map/at.md b/reference/flat_map/flat_map/at.md index 00317087d5..17933b15bb 100644 --- a/reference/flat_map/flat_map/at.md +++ b/reference/flat_map/flat_map/at.md @@ -74,7 +74,7 @@ int main() } ``` * c.at[color ff0000] -* fm.insert[link insert.md.nolink] +* fm.insert[link insert.md] * std::out_of_range[link /reference/stdexcept.md] ### 出力 diff --git a/reference/flat_map/flat_map/emplace.md b/reference/flat_map/flat_map/emplace.md index b87c0a2030..28a7e713d7 100644 --- a/reference/flat_map/flat_map/emplace.md +++ b/reference/flat_map/flat_map/emplace.md @@ -132,7 +132,7 @@ CCC : (1, 2) | 名前 | 説明 | |------------------------------------------------|--------------------------------------------| -| [`flat_map::insert`](insert.md.nolink) | 要素を挿入する | +| [`flat_map::insert`](insert.md) | 要素を挿入する | | [`flat_map::insert_or_assign`](insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する | | [`flat_map::emplace_hint`](emplace_hint.md) | ヒントを使って要素を直接構築する | | [`flat_map::try_emplace`](try_emplace.md) | キーが存在しない場合のみ要素を直接構築する | diff --git a/reference/flat_map/flat_map/emplace_hint.md b/reference/flat_map/flat_map/emplace_hint.md index 7a016946ba..a667e951cf 100644 --- a/reference/flat_map/flat_map/emplace_hint.md +++ b/reference/flat_map/flat_map/emplace_hint.md @@ -75,7 +75,7 @@ int main() | 名前 | 説明 | |------------------------------------------------|--------------------------------------------| -| [`flat_map::insert`](insert.md.nolink) | 要素を挿入する | +| [`flat_map::insert`](insert.md) | 要素を挿入する | | [`flat_map::insert_or_assign`](insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する | | [`flat_map::emplace`](emplace.md) | 要素を直接構築する | | [`flat_map::try_emplace`](try_emplace.md) | キーが存在しない場合のみ要素を直接構築する | diff --git a/reference/flat_map/flat_map/empty.md b/reference/flat_map/flat_map/empty.md index 610139592c..74651c9352 100644 --- a/reference/flat_map/flat_map/empty.md +++ b/reference/flat_map/flat_map/empty.md @@ -41,7 +41,7 @@ int main () } ``` * empty()[color ff0000] -* fm.insert[link insert.md.nolink] +* fm.insert[link insert.md] ### 出力 ``` diff --git a/reference/flat_map/flat_map/erase.md b/reference/flat_map/flat_map/erase.md index 9c39eed049..263666493b 100644 --- a/reference/flat_map/flat_map/erase.md +++ b/reference/flat_map/flat_map/erase.md @@ -141,6 +141,6 @@ int main() | 名前 | 説明 | |---------------------------------|----------------------| | [`flat_map::clear`](clear.md) | 全ての要素を削除する | -| [`flat_map::insert`](insert.md.nolink) | 要素を挿入する | +| [`flat_map::insert`](insert.md) | 要素を挿入する | | [`flat_map::find`](find.md) | 指定したキーで要素を探す | diff --git a/reference/flat_map/flat_map/insert.md b/reference/flat_map/flat_map/insert.md new file mode 100644 index 0000000000..d3c7e9001b --- /dev/null +++ b/reference/flat_map/flat_map/insert.md @@ -0,0 +1,303 @@ +# insert +* flat_map[meta header] +* std[meta namespace] +* flat_map[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +pair insert(const value_type& x); // (1) C++23 +pair insert(value_type&& x); // (2) C++23 + +iterator insert(const_iterator position, + const value_type& x); // (3) C++23 +iterator insert(const_iterator position, + value_type&& x); // (4) C++23 + +template +pair insert(P&& x); // (5) C++23 + +template +iterator insert(const_iterator position, + P&&); // (6) C++23 + +template +void insert(InputIterator first, + InputIterator last); // (7) C++23 + +template +void insert(sorted_unique_t, + InputIterator first, + InputIterator last); // (8) C++23 + +template R> +void insert_range(R&& rg); // (9) C++23 + +void insert(initializer_list il); // (10) C++23 + +void insert(sorted_unique_t s, + initializer_list il); // (11) C++23 +``` +* pair[link /reference/utility/pair.md] +* initializer_list[link /reference/initializer_list/initializer_list.md] +* sorted_unique_t[link ] + +## 概要 +新しく一つの要素(引数 `x`, `y`を使う)または要素のシーケンス(入力イテレータまたは `initializer_list` を使う)を挿入し、コンテナを拡張する。 + +これは、挿入された要素の数だけコンテナの [`size()`](size.md) を増やす。 + +`flat_map` コンテナは重複したキーを持つ要素を許さないため、挿入操作はそれぞれの要素が他のコンテナ内の既存要素と同じキーかどうかをチェックする。もし同じであれば要素は挿入されず、戻り値を持つ関数の場合はそれへのイテレータなどを返す。 + +重複した値を許す、類似したコンテナについては `flat_multimap` を参照。 + +内部的に `flat_map` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。 + +この操作は、適切な引数 `position` を提供することで効率を飛躍的に改善することができる。 + +- (1) : 単一要素を挿入する +- (2) : 単一要素の一時オブジェクトを挿入する +- (3) : 指定された位置に、単一要素を挿入する +- (4) : 指定された位置に、単一要素の一時オブジェクトを挿入する +- (5) : 単一要素として要素型`value_type`のコンストラクタ引数を受け取って挿入する +- (6) : 指定された位置に、要素型`value_type`のコンストラクタ引数を受け取って挿入する +- (7) : イテレータ範囲`[first, last)`を挿入する +- (8) : ソート済みかつ重複要素のないイテレータ範囲`[first, last)`を挿入する +- (9) : Rangeを挿入する +- (10) : 初期化子リストを挿入する +- (11) : ソート済みかつ重複要素のない初期化子リストを挿入する + + +## 要件 +- (5), (6) : [`is_constructible_v`](/reference/type_traits/is_constructible.md)`<`[`pair`](/reference/utility/pair.md)`, P>`が`true`であること + + +## 効果 +- (1) : + ```cpp + return emplace(x); + ``` + * emplace[link emplace.md] + +- (2) : + ```cpp + return emplace(std::move(x)); + ``` + * emplace[link emplace.md] + * move[link /reference/utility/move.md] + +- (3) : + ```cpp + return emplace_hint(position, x); + ``` + * emplace_hint[link emplace_hint.md] + +- (4) : + ```cpp + return emplace_hint(position, std::move(x)); + ``` + * emplace_hint[link emplace_hint.md] + * move[link /reference/utility/move.md] + +- (5) : 以下と等価: + ```cpp + return emplace(std::forward

(x)); + ``` + * emplace[link emplace.md] + * forward[link /reference/utility/forward.md] + +- (6) : 以下と等価: + ```cpp + return emplace_hint(position, std::forward

(x));. + ``` + * emplace_hint[link emplace_hint.md] + * forward[link /reference/utility/forward.md] + +- (7) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: + ```cpp + for (; first != last; ++first) { + value_type value = *first; + c.keys.insert(c.keys.end(), std::move(value.first)); + c.values.insert(c.values.end(), std::move(value.second)); + } + ``` + * c.keys[link containers.md] + * c.values[link containers.md] + * end()[link /reference/vector/vector/end.md] + * insert[link /reference/vector/vector/insert.md] + * std::move[link /reference/utility/move.md] + * first[link /reference/utility/pair.md] + * second[link /reference/utility/pair.md] + + - 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする + - 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする + - 最後に、重複する要素を以下のように削除する: + + ```cpp + auto zv = ranges::zip_view(c.keys, c.values); + auto it = ranges::unique(zv, key_equiv(compare)).begin(); + auto dist = distance(zv.begin(), it); + c.keys.erase(c.keys.begin() + dist, c.keys.end()); + c.values.erase(c.values.begin() + dist, c.values.end()); + ``` + * c.keys[link containers.md] + * c.values[link containers.md] + * ranges::zip_view[link /ranges/zip_view.md.nolink] + * ranges::unique[link /reference/algorithm/ranges_unique.md] + * key_equiv[link key_equiv.md] + * distance[link /reference/iterator/distance.md] + +- (8) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: + ```cpp + for (; first != last; ++first) { + value_type value = *first; + c.keys.insert(c.keys.end(), std::move(value.first)); + c.values.insert(c.values.end(), std::move(value.second)); + } + ``` + * c.keys[link containers.md] + * c.values[link containers.md] + * end()[link /reference/vector/vector/end.md] + * insert[link /reference/vector/vector/insert.md] + * std::move[link /reference/utility/move.md] + * first[link /reference/utility/pair.md] + * second[link /reference/utility/pair.md] + + - 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする + - 最後に、重複する要素を以下のように削除する: + + ```cpp + auto zv = ranges::zip_view(c.keys, c.values); + auto it = ranges::unique(zv, key_equiv(compare)).begin(); + auto dist = distance(zv.begin(), it); + c.keys.erase(c.keys.begin() + dist, c.keys.end()); + c.values.erase(c.values.begin() + dist, c.values.end()); + ``` + * c.keys[link containers.md] + * c.values[link containers.md] + * ranges::zip_view[link /ranges/zip_view.md.nolink] + * ranges::unique[link /reference/algorithm/ranges_unique.md] + * key_equiv[link key_equiv.md] + * distance[link /reference/iterator/distance.md] + +- (9) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: + ```cpp + for (const auto& e : rg) { + c.keys.insert(c.keys.end(), e.first); + c.values.insert(c.values.end(), e.second); + } + ``` + * c.keys[link containers.md] + * c.values[link containers.md] + * end()[link /reference/vector/vector/end.md] + * insert[link /reference/vector/vector/insert.md] + * first[link /reference/utility/pair.md] + * second[link /reference/utility/pair.md] + + - 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする + - 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする + - 最後に、重複する要素を以下のように削除する: + + ```cpp + auto zv = ranges::zip_view(c.keys, c.values); + auto it = ranges::unique(zv, key_equiv(compare)).begin(); + auto dist = distance(zv.begin(), it); + c.keys.erase(c.keys.begin() + dist, c.keys.end()); + c.values.erase(c.values.begin() + dist, c.values.end()); + ``` + * c.keys[link containers.md] + * c.values[link containers.md] + * ranges::zip_view[link /ranges/zip_view.md.nolink] + * ranges::unique[link /reference/algorithm/ranges_unique.md] + * key_equiv[link key_equiv.md] + * distance[link /reference/iterator/distance.md] + +- (10) : + ```cpp + insert(il.begin(), il.end()); + ``` + +- (11) : + ```cpp + insert(s, il.begin(), il.end()); + ``` + + +## 戻り値 +- (1), (2), (5) : 戻り値としては、イテレータと`bool`値の組を返す。 + - 挿入された場合には、`first` に挿入された要素へのイテレータ、 `second` に `true` が設定される。 + - 挿入されなかった場合には、 `first` に `x` と等価のキーを持つ要素へのイテレータ、 `second` に `false` が設定される。 +- (3), (4), (6) : + - 挿入された場合には、新しく挿入された要素を指すイテレータを返す。 + - 挿入されなかった場合には、`x`のキーと等価のキーを持つ要素へのイテレータを返す。 +- (7), (8), (9), (10), (11) : なし + + +## 計算量 +- (7) : Nをこの操作の前の[`size()`](size.md)、Mを[`distance`](/reference/iterator/distance.md)`(first, last)`として、N + MlogM +- (7) : Nをこの操作のあとの[`size()`](size.md)として、Nに対して線形 +- (8) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM + + +## 備考 +- (7), (8), (9) : この操作はインプレース・マージを行うため、追加のメモリ確保を行う可能性がある + + +## 例 +```cpp example +#include +#include + +int main() +{ + std::flat_map fm; + + // 単一要素を挿入する + fm.insert(std::pair{3, 'a'}); + fm.insert({3, 'a'}); + + std::flat_map fm2 = { + {5, 'd'}, + {15, 'e'} + }; + + // シーケンスを挿入する + fm.insert(fm2); + fm.insert(fm2.begin(), fm2.end()); + + // 挿入するシーケンスがソート済みかつ重複要素がないことがわかっている場合、 + // 以下のように指定した方が高速になる + fm.insert(std::sorted_unique, fm2.begin(), fm2.end()); + + for (const auto& [key, value] : fm) { + std::cout << key << " : " << value << std::endl; + } +} +``` +* begin()[link begin.md] +* end()[link end.md] +* std::sorted_unique[link /reference/flat_map/sorted_unique_t.md] + +### 出力 +``` +3 : a +5 : d +15 : e +``` + +## バージョン +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? + + +## 関連項目 + +| 名前 | 説明 | +|------------------------------------------------|--------------------------------------------| +| [`flat_map::insert_or_assign`](insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する | +| [`flat_map::emplace`](emplace.md) | 要素を直接構築する | +| [`flat_map::emplace_hint`](emplace_hint.md) | ヒントを使って要素を直接構築する | +| [`flat_map::try_emplace`](try_emplace.md) | キーが存在しない場合のみ要素を直接構築する | + diff --git a/reference/flat_map/flat_map/key_equiv.md b/reference/flat_map/flat_map/key_equiv.md new file mode 100644 index 0000000000..5e4e771f24 --- /dev/null +++ b/reference/flat_map/flat_map/key_equiv.md @@ -0,0 +1,32 @@ +# key_equiv +* flat_map[meta header] +* std[meta namespace] +* flat_map[meta class] +* class[meta id-type] +* cpp23[meta cpp] + +```cpp +struct key_equiv { + key_equiv(key_compare c) : comp(c) { } + + bool operator()(const_reference x, const_reference y) const { + return !comp(x.first, y.first) && !comp(y.first, x.first); + } + + key_compare comp; +}; +``` + +## 概要 +要素をとってキーの等価比較を行う説明専用の関数オブジェクト。 + + +## バージョン +### 言語 +- C++23 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? + diff --git a/reference/flat_map/flat_map/op_at.md b/reference/flat_map/flat_map/op_at.md index 113fb30e2a..a2400349c4 100644 --- a/reference/flat_map/flat_map/op_at.md +++ b/reference/flat_map/flat_map/op_at.md @@ -77,7 +77,7 @@ int main() ``` * fm[1][color ff0000] * fm[2][color ff0000] -* fm.insert[link insert.md.nolink] +* fm.insert[link insert.md] ### 出力 ``` diff --git a/reference/flat_map/flat_map/size.md b/reference/flat_map/flat_map/size.md index 580aa8b4ad..328270899d 100644 --- a/reference/flat_map/flat_map/size.md +++ b/reference/flat_map/flat_map/size.md @@ -46,7 +46,7 @@ int main () } ``` * size()[color ff0000] -* fm.insert[link insert.md.nolink] +* fm.insert[link insert.md] ### 出力 ``` diff --git a/reference/flat_map/flat_map/try_emplace.md b/reference/flat_map/flat_map/try_emplace.md index 5a5d8c721a..dea4790f43 100644 --- a/reference/flat_map/flat_map/try_emplace.md +++ b/reference/flat_map/flat_map/try_emplace.md @@ -123,7 +123,7 @@ iterator ## 備考 - 概要に記載されているように、本メンバ関数は指定されたキーと等価の要素が既に存在する場合には、引数に副作用が発生しない。 - 一方、[`emplace`](emplace.md)、[`emplace_hint`](emplace_hint.md)、[`insert`](insert.md.nolink) にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。 + 一方、[`emplace`](emplace.md)、[`emplace_hint`](emplace_hint.md)、[`insert`](insert.md) にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。 ## 例 @@ -171,7 +171,7 @@ false, 114, false | 名前 | 説明 | |------------------------------------------------|--------------------------------------------| -| [`flat_map::insert`](insert.md.nolink) | 要素を挿入する | +| [`flat_map::insert`](insert.md) | 要素を挿入する | | [`flat_map::insert_or_assign`](insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する | | [`flat_map::emplace`](emplace.md) | 要素を直接構築する | | [`flat_map::emplace_hint`](emplace_hint.md) | ヒントを使って要素を直接構築する | diff --git a/reference/flat_map/sorted_unique_t.md b/reference/flat_map/sorted_unique_t.md new file mode 100644 index 0000000000..67d6e68962 --- /dev/null +++ b/reference/flat_map/sorted_unique_t.md @@ -0,0 +1,66 @@ +# sorted_unique_t +* flat_map[meta header] +* std[meta namespace] +* class[meta id-type] +* cpp23[meta cpp] + +```cpp +namespace std { + struct sorted_unique_t { explicit sorted_unique_t() = default; }; + inline constexpr sorted_unique_t sorted_unique{}; +} +``` + +## 概要 +`sorted_unique_t`は、[`flat_map`](flat_map.md)コンテナに挿入するシーケンスがソート済みかつ重複要素がないことを示すためのタグ型および値である。 + +このクラス自体は空であり、オーバーロード解決のためにのみ使用される。 + + +## 例 +```cpp example +#include +#include + +int main() +{ + std::flat_map fm = { + {3, 'a'} + }; + + std::flat_map fm2 = { + {5, 'd'}, + {15, 'e'} + }; + + // 挿入するシーケンスがソート済みかつ重複要素がないことがわかっている場合、 + // sorted_uniqueを指定した方が高速になる + fm.insert(std::sorted_unique, fm2.begin(), fm2.end()); + + for (const auto& [key, value] : fm) { + std::cout << key << " : " << value << std::endl; + } +} +``` +* std::sorted_unique[color ff0000] +* insert[link flat_map/insert.md] +* begin()[link flat_map/begin.md] +* end()[link flat_map/end.md] + +### 出力 +``` +``` + +## バージョン +### 言語 +- C++23 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? + + +## 関連項目 +- [`std::flat_map`](flat_map.md) + diff --git a/reference/map/map/insert.md b/reference/map/map/insert.md index 67fa498234..db4b323470 100644 --- a/reference/map/map/insert.md +++ b/reference/map/map/insert.md @@ -32,7 +32,7 @@ iterator insert(const_iterator hint, node_type&& nh); // (8) C++17か ## 概要 新しく一つの要素(引数 `x`, `y`を使う)または要素のシーケンス(入力イテレータまたは `initializer_list` を使う)または[ノードハンドル](/reference/node_handle/node_handle.md)を挿入することにより、 `map` コンテナを拡張する。 -これは、挿入された要素の数だけコンテナの [`size()`](/reference/map/map/size.md) を増やす。 +これは、挿入された要素の数だけコンテナの [`size()`](size.md) を増やす。 `map` コンテナは重複したキーを持つ要素を許さないため、挿入操作はそれぞれの要素が他のコンテナ内の既存要素と同じキーかどうかをチェックする。もし同じであれば要素は挿入されず、戻り値を持つ関数の場合はそれへのイテレータなどを返す。 @@ -86,7 +86,7 @@ iterator insert(const_iterator hint, node_type&& nh); // (8) C++17か - (1), (2) : 対数時間 - (3), (4) : 一般に対数時間だが、指定された新たな要素が `position` が指す要素の直前に挿入された場合は償却定数時間。(ただし、備考も参照) - (5), (6) : 一般に N log(size + N)。(ただし、備考も参照) - - ここで、 `N` は `first` と `last` の間の距離であり `size` は挿入前のコンテナの [`size()`](/reference/map/map/size.md) を表す。 + - ここで、 `N` は `first` と `last` の間の距離であり `size` は挿入前のコンテナの [`size()`](size.md) を表す。 - (7) : 対数時間 - (8) : 一般に対数時間だが、指定された新たな要素が `position` が指す要素の直前に挿入された場合は償却定数時間。 diff --git a/reference/map/multimap/insert.md b/reference/map/multimap/insert.md index 1005aac1a9..946a11c844 100644 --- a/reference/map/multimap/insert.md +++ b/reference/map/multimap/insert.md @@ -32,7 +32,7 @@ iterator insert(const_iterator hint, node_type&& nh); // (10) C++17 ## 概要 新しく一つの要素(引数 `x`, `y`を使う)、要素のシーケンス(入力イテレータまたは `initializer_list` を使う)または[ノードハンドル](/reference/node_handle/node_handle.md)を挿入することにより、 `multimap` コンテナを拡張する。 -これは、挿入された要素の数だけコンテナの [`size()`](/reference/map/multimap/size.md) を増やす。 +これは、挿入された要素の数だけコンテナの [`size()`](size.md) を増やす。 内部的に `multimap` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。