public member function
<unordered_map>

std::unordered_multimap::insert

(1)
iterator insert ( const value_type& val );
(2)
template <class P>    iterator insert ( P&& val );
(3)
iterator insert ( const_iterator hint, const value_type& val );
(4)
template <class P>    iterator insert ( const_iterator hint, P&& val );
(5)
template <class InputIterator>    void insert ( InputIterator first, InputIterator last );
(6)
void insert ( initializer_list<value_type> il );
插入元素
unordered_multimap 中插入新元素。

这会使容器的 size 增加已插入元素的数量。

参数决定了插入多少元素以及它们被初始化为哪个值。

参数

val
要复制到(或移动作为)新元素的值的对象。
版本 (1) 和 (3) 复制元素(即,val保留其内容,容器保留副本)。
版本 (2) 和 (4) 移动元素(即,val失去其内容,该内容被容器中的新元素获取)。
成员类型value_type是容器中元素的类型,在 unordered_multimap 中定义为pair<const key_type,mapped_type>,其中成员类型key_type是第一个模板参数(键类型)的别名,而mapped_type是第二个模板参数(映射类型,T).
接受 P&& 参数的签名仅在P是可隐式转换为value_type.
接受 P&& 参数的签名仅在 std::is_constructible<value_type,P&&>true 时调用。
hint
指向一个位置的迭代器,该位置被建议作为开始搜索适当插入点的提示。容器可能会也可能不会使用此值来优化操作。无论传递给hint.
成员类型const_iterator是一个 forward iterator 类型。
first, last
指定元素范围的迭代器。范围中元素的副本[first,last)被插入到 unordered_multimap 容器中。
请注意,范围包括 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
neitherfirstnorlast应该是目标容器中的迭代器。
模板类型可以是任何 input iterator
il
一个 initializer_list 对象。编译器将自动从初始化列表声明器创建此类对象。
成员类型value_type是容器所包含元素的类型,在 unordered_multimap 中定义为pair<const key_type,mapped_type>,其中成员类型key_type是第一个模板参数(键类型)的别名,而mapped_type是第二个模板参数(映射类型,T).

返回值

在返回值的版本中((1),(2),(3) 和 (4)),函数返回一个指向新插入元素的迭代器。

版本 (5) 和 (6) 不返回值。

成员类型iterator是一个 forward iterator 类型。

新元素的存储使用allocator_traits<allocator_type>::construct()分配,这在失败时可能会抛出异常(对于默认的 allocatorbad_alloc如果分配请求不成功,则抛出)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// unordered_multimap::insert
#include <iostream>
#include <string>
#include <unordered_map>

int main ()
{
  std::unordered_multimap<std::string,int>
              first,
              second = {{"AAPL",200},{"GOOG",100}};

  std::pair<std::string,int> mypair ("MSFT",500);

  first.insert (mypair);                            // copy insertion
  first.insert (std::make_pair<std::string,int>("GOOG",50)); // move insertion
  first.insert (second.begin(), second.end());  // range insertion
  first.insert ( {{"ORCL",100},{"GOOG",100}} );    // initializer list insertion

  std::cout << "first contains:" << std::endl;
  for (auto& x: first)
    std::cout << x.first << ": " << x.second << std::endl;

  std::cout << std::endl;
  return 0;
}

可能的输出
first contains:
AAPL: 200
MSFT: 500
ORCL: 100
GOOG: 50
GOOG: 100
GOOG: 100


复杂度

单元素插入
平均情况:常量。
最坏情况:容器大小的线性。
多元素插入
平均情况:已插入元素数量的线性。
最坏情况N*(size+1):插入的元素数量乘以容器大小加一。
可能会触发 rehash(未包含)。

迭代器有效性

在大多数情况下,插入后容器中的所有迭代器都保持有效。唯一的例外是当容器的增长强制重新哈希时。在这种情况下,容器中的所有迭代器都将失效。

如果插入操作后新容器的 size 会超过其容量阈值(该阈值计算为容器的 bucket_count 乘以其 max_load_factor),则会强制重新哈希。

在所有情况下,`unordered_multimap` 容器中元素的引用都保持有效,即使在 rehash 之后也是如此。

另见