public member function
<map>

std::map::emplace

template <class... Args>  pair<iterator,bool> emplace (Args&&... args);
构造并插入元素
如果其键是唯一的,则在 map 中插入新元素。使用 args 作为构造一个value_type(它是 pair 类型对象)的参数,新元素将被就地构造。

仅当容器中没有其他元素具有与要 emplaced 的键等效的键时,才会进行插入(map 容器中的键是唯一的)。

如果成功插入,容器的 size 将增加一。

map 容器在内部会根据其 比较对象 指定的标准,始终按键将所有元素保持排序状态。元素始终被插入到其排序后的相应位置。

通过调用 allocator_traits::construct 并转发 args 来就地构造元素。

存在一个类似的成员函数 insert,它将现有对象复制或移动到容器中。

参数

args
用于构造插入元素的 mapped type 的新对象的参数。
转发给用于构造新元素(类型为 pair<const key_type, mapped_type>)的参数。
可以是以下之一:
- 两个参数:一个用于 key,另一个用于 mapped value
- 一个类型为 pair 的参数,其第一个成员是 key 的值,第二个成员是 mapped value 的值。
- 以 piecewise_construct 作为第一个参数,再加上两个额外的参数,这些参数是用于分别转发给 key valuemapped value 的构造参数的 tuple
有关更多信息,请参阅 pair::pair

返回值

如果函数成功插入元素(因为 map 中不存在等效元素),则函数返回一个 pair,其第一个成员是指向新插入元素的迭代器,第二个成员是true.

否则,它返回一个指向容器中等效元素的迭代器,以及一个值为false.

成员类型iterator是指向元素的 双向迭代器 类型。
pair是声明在<utility>中的类模板(参见pair)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// map::emplace
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;

  mymap.emplace('x',100);
  mymap.emplace('y',200);
  mymap.emplace('z',100);

  std::cout << "mymap contains:";
  for (auto& x: mymap)
    std::cout << " [" << x.first << ':' << x.second << ']';
  std::cout << '\n';

  return 0;
}
输出
mymap contains: [x:100] [y:200] [z:100]


复杂度

对容器 size 的对数复杂度。

迭代器有效性

没有变化。

数据竞争

容器被修改。
并发访问现有元素是安全的,但迭代容器中的范围不是。

异常安全

强保证:如果抛出异常,容器没有发生变化。
如果 allocator_traits::construct 不支持适当的参数,则会导致 未定义行为

另见