Namespaces
Variants

std::multimap<Key,T,Compare,Allocator>:: insert

From cppreference.net
iterator insert ( const value_type & value ) ;
(1)
iterator insert ( value_type && value ) ;
(2) (C++17以降)
template < class P >
iterator insert ( P && value ) ;
(3) (C++11以降)
(4)
iterator insert ( iterator pos, const value_type & value ) ;
(C++11以前)
iterator insert ( const_iterator pos, const value_type & value ) ;
(C++11以降)
iterator insert ( const_iterator pos, value_type && value ) ;
(5) (C++17以降)
template < class P >
iterator insert ( const_iterator pos, P && value ) ;
(6) (C++11以降)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(7)
void insert ( std:: initializer_list < value_type > ilist ) ;
(8) (C++11以降)
iterator insert ( node_type && nh ) ;
(9) (C++17以降)
iterator insert ( const_iterator pos, node_type && nh ) ;
(10) (C++17以降)

要素をコンテナに挿入します。

1-3) value を挿入します。コンテナに同等のキーを持つ要素が存在する場合、その範囲の上限位置に挿入します。
オーバーロード (3) emplace ( std:: forward < P > ( value ) ) と等価であり、 std:: is_constructible < value_type, P && > :: value == true の場合にのみオーバーロード解決に参加します。
4-6) value pos の直前の位置にできるだけ近い位置に挿入します。
オーバーロード (6) emplace_hint ( hint, std:: forward < P > ( value ) ) と等価であり、 std:: is_constructible < value_type, P && > :: value == true の場合にのみオーバーロード解決に参加します。
7) 範囲 [ first , last ) から要素を挿入します。
8) 初期化子リストから要素を挿入 ilist
9) nh が空の node handle である場合、何も行わない。それ以外の場合、 nh が所有する要素をコンテナに挿入し、挿入された要素を指すイテレータを返す。コンテナ内に nh. key ( ) と等価なキーを持つ要素の範囲が存在する場合、その範囲の末尾に要素が挿入される。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) の場合、動作は未定義である。
10) nh が空の node handle の場合、何もせずに終端イテレータを返す。それ以外の場合、 nh が所有する要素をコンテナに挿入し、 nh. key ( ) と等価なキーを持つ要素を指すイテレータを返す。要素は pos の直前の位置にできるだけ近くなるように挿入される。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) の場合、動作は未定義である。

イテレータおよび参照は無効化されません。 挿入が成功した場合、ノードハンドル内に保持されている間に取得された要素へのポインタおよび参照は無効化され、抽出前にその要素に対して取得されたポインタおよび参照は有効になります。 (C++17以降)

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、リンク先は一切変更していません - C++関連の専門用語(Parameters、Return value、Exceptions、Complexity、Example、Defect reports、See also)は原文のまま保持しています - 番号部分と書式は完全に維持しています

パラメータ

pos - 新しい要素が挿入される位置の前を指すイテレータ
value - 挿入する要素の値
first, last - 挿入する要素のソース範囲を定義するイテレータのペア range
ilist - 値の挿入元となる初期化子リスト
nh - 互換性のある node handle
型要件
-
InputIt LegacyInputIterator の要件を満たさなければならない。

戻り値

1-6) 挿入された要素へのイテレータ。
7,8) (なし)
9,10) nh が空の場合終了イテレータ、それ以外の場合挿入された要素を指すイテレータ。

例外

1-6) 例外が任意の操作によってスローされた場合、挿入は無効となります。
7,8) 例外安全性保証なし。
9,10) 例外が任意の操作によってスローされた場合、挿入は無効となります。

計算量

1-3) O(log(size()))
4-6) 挿入が pos の直前に発生する場合、償却定数時間、 O(log(size())) それ以外の場合。
7,8) O(N·log(size() + N)) 、ここで N は挿入する要素の数です。
9) O(log(size()))
10) 挿入が pos の直前に発生する場合、償却定数時間。 O(log(size())) それ以外の場合。

#include <functional>
#include <iostream>
#include <map>
#include <string>
#include <string_view>
#include <utility>
template<class M>
void print(const std::string_view rem, const M& mmap)
{
    std::cout << rem << ' ';
    for (const auto& e : mmap)
        std::cout << '{' << e.first << ',' << e.second << "} ";
    std::cout << '\n';
}
int main()
{
    // リスト初期化
    std::multimap<int, std::string, std::greater<int>> mmap
        {{2, "foo"}, {2, "bar"}, {3, "baz"}, {1, "abc"}, {5, "def"}};
    print("#1", mmap);
    // value_typeを使用した挿入
    mmap.insert(decltype(mmap)::value_type(5, "pqr"));
    print("#2", mmap);
    // pairを使用した挿入
    mmap.insert(std::pair{6, "uvw"});
    print("#3", mmap);
    mmap.insert({7, "xyz"});
    print("#4", mmap);
    // initializer_listを使用した挿入
    mmap.insert({{5, "one"}, {5, "two"}});
    print("#5", mmap);
    // イテレータのペアを使用した挿入
    mmap.clear();
    const auto il = {std::pair{1, "ä"}, {2, "ё"}, {2, "ö"}, {3, "ü"}};
    mmap.insert(il.begin(), il.end());
    print("#6", mmap);
}

出力:

#1 {5,def} {3,baz} {2,foo} {2,bar} {1,abc}
#2 {5,def} {5,pqr} {3,baz} {2,foo} {2,bar} {1,abc}
#3 {6,uvw} {5,def} {5,pqr} {3,baz} {2,foo} {2,bar} {1,abc}
#4 {7,xyz} {6,uvw} {5,def} {5,pqr} {3,baz} {2,foo} {2,bar} {1,abc}
#5 {7,xyz} {6,uvw} {5,def} {5,pqr} {5,one} {5,two} {3,baz} {2,foo} {2,bar} {1,abc}
#6 {3,ü} {2,ё} {2,ö} {1,ä}

欠陥報告

以下の動作変更に関する欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 233 C++98 pos は単なるヒントであり、完全に無視される可能性があった 挿入は pos の直前の位置に
できる限り近くなるように
行われることが要求される
LWG 264 C++98 オーバーロード (5) の計算量は、範囲 [ first , last ) Compare に従って
ソートされている場合、線形であることが要求されていた
この特別なケースにおける
線形計算量の要件を削除
LWG 371 C++98 等価な要素の順序は
保持されることが保証されていなかった
保持されることが要求される
LWG 2005 C++11 オーバーロード (3,6) の記述が不十分であった 記述を改善

関連項目

(C++11)
要素をその場で構築する
(公開メンバ関数)
ヒントを使用して要素をその場で構築する
(公開メンバ関数)
引数から推論された型の std::insert_iterator を作成する
(関数テンプレート)