名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | container‎ | multimap
 
 
 
 
iterator insert( const value_type& value );
(1)
iterator insert( value_type&& value );
(1) (C++17以上)
template< class P >
iterator insert( P&& value );
(2) (C++11以上)
(3)
iterator insert( iterator hint, const value_type& value );
(C++11未満)
iterator insert( const_iterator hint, const value_type& value );
(C++11以上)
iterator insert( const_iterator hint, value_type&& value );
(3) (C++17以上)
template< class P >
iterator insert( const_iterator hint, P&& value );
(4) (C++11以上)
template< class InputIt >
void insert( InputIt first, InputIt last );
(5)
void insert( std::initializer_list<value_type> ilist );
(6) (C++11以上)
iterator insert(node_type&& nh);
(7) (C++17以上)
iterator insert(const_iterator hint, node_type&& nh);
(8) (C++17以上)

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

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

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

目次

[編集] 引数

hint -
検索を開始する位置の提案として使用されるイテレータ (C++11未満)
前に新しい要素が挿入される位置を指すイテレータ (C++11以上)
value - 挿入する要素の値
first, last - 挿入する要素の範囲
ilist - 挿入する要素の初期化子リスト
nh - 互換性のあるノードハンドル
型の要件
-
InputItLegacyInputIterator の要件を満たさなければなりません。

[編集] 戻り値

1-4) 挿入された要素を指すイテレータを返します。
5-6) (なし)
7,8) nh が空の場合は終端イテレータ、そうでなければ挿入された要素を指すイテレータ。

[編集] 例外

1-4) 何らかの操作によって例外が投げられた場合、挿入は効果を持ちません。

[編集] 計算量

1-2) コンテナのサイズの対数、O(log(size())).
3-4) 挿入が hint の直の位置に行われた場合、償却定数時間。 そうでなければ、コンテナのサイズの対数。
(C++11未満)
3-4) 挿入が hint の直の位置に行われた場合、償却定数時間。 そうでなければ、コンテナのサイズの対数。
(C++11以上)
5-6) O(N*log(size() + N))、ただし N は挿入する要素の数です。
7) コンテナのサイズの対数、O(log(size())).
8) 挿入が hint の直の位置に行われた場合、償却定数時間。 そうでなければ、コンテナのサイズの対数。

[編集]

#include <iostream>
#include <string>
#include <map>
#include <functional>
 
template<class M>
void print(const M& mmap)
{
    for (auto & e : mmap)
        std::cout << "{" << e.first << "," << e.second << "} ";
    std::cout << '\n';
}
 
int main()
{
  // list-initialize
  std::multimap<int, std::string, std::greater<int>> mmap 
    {{2, "foo"}, {2, "bar"}, {3, "baz"}, {1, "abc"}, {5, "def"}};
 
  // insert using value_type
  mmap.insert(decltype(mmap)::value_type(5, "pqr"));
  print(mmap);
 
  // insert using make_pair
  mmap.insert(std::make_pair(6, "uvw"));
  print(mmap);
 
  mmap.insert({7, "xyz"});
  print(mmap);
 
  // insert using initialization_list
  mmap.insert({{5, "one"}, {5, "two"}});
  print(mmap);
 
  // erase all entries with key 5
  mmap.erase(5);
  print(mmap);
 
  // find and erase a specific entry
  auto pos = mmap.begin();
  while (pos->second != "bar" && pos != mmap.end()) ++pos;
  mmap.erase(pos);
  print(mmap);
}

出力:

{5,def} {5,pqr} {3,baz} {2,foo} {2,bar} {1,abc} 
{6,uvw} {5,def} {5,pqr} {3,baz} {2,foo} {2,bar} {1,abc} 
{7,xyz} {6,uvw} {5,def} {5,pqr} {3,baz} {2,foo} {2,bar} {1,abc} 
{7,xyz} {6,uvw} {5,def} {5,pqr} {5,one} {5,two} {3,baz} {2,foo} {2,bar} {1,abc} 
{7,xyz} {6,uvw} {3,baz} {2,foo} {2,bar} {1,abc} 
{7,xyz} {6,uvw} {3,baz} {2,foo} {1,abc}

[編集] 関連項目

(C++11)
要素をその場で構築します
(パブリックメンバ関数) [edit]
ヒントを使用して要素をその場で構築します
(パブリックメンバ関数) [edit]