C++官网参考链接:https://cplusplus.com/reference/map/map/emplace/
公有成员函数
<map>
std::map::emplace
template <class... Args> pair<iterator,bool> emplace (Args&&... args);
构造并插入元素
如果元素的键是唯一的,则在map中插入新元素。这个新元素是使用args作为构造value_type(这是一个pair类型的对象)的实参来就地构造的。
只有当容器中没有其他元素具有与被放置的元素相同的键时(map容器中的键是唯一的),才会进行插入。
如果插入,这将有效地使容器的size增加1。
在内部,map容器按照其比较对象(comparison object)指定的标准按键对所有元素进行排序。元素总是按照这个顺序插入到它各自的位置。
元素是通过使用转发的args调用allocator_traits::construct就地构造的。
存在一个类似的成员函数insert,它将现有对象复制或移动到容器中。
形参
args
C++11
用于为插入的元素构造映射类型的新对象的实参。
C++14
用来构造新元素而转发的实参(类型pair<const key_type, mapped_type>)。
这可以是:
- 两个实参:一个用于键,另一个用于映射值。
- pair类型的单个实参,键的值作为first成员,映射的值作为second成员。
- piecewise_construct作为第一个实参,另外两个tuples实参分别转发作为键值和映射值的实参。
更多信息请参见pair::pair。
返回值
如果函数成功插入元素(因为map中还没有等价的元素),则函数返回一个pair指向新插入元素的iterator和一个true值。
否则,它返回一个指向容器内等价元素的iterator和一个false值。
成员类型iterator是指向元素的双向iterator(bidirectional iterator)类型。
pair是在<utility>中声明的类模板(参见pair)。
用例
// 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;
}
输出:
复杂度
容器的size中的对数。
iterator的有效性
没有变化。
数据竞争
完成容器的修改。
同时访问现有的元素是安全的,但是迭代容器中的范围就不安全了。
异常安全
强保证:如果抛出异常,则容器中不会有任何更改。
如果适当的实参不支持allocator_traits::construct,则会导致未定义的行为。