std::
map::emplace
公众成员函数 <map>
template <class... Args>
pair<iterator,bool> emplace (Args&&... args);
构造并插入元素
在集合中插入一个新元素(如果新元素的键唯一的话)。这个新元素是使用
args作为
value_type
(它是
pair类型的对象)构造的参数即时构造。
只有当容器中没有其他元素的键与被放置的键等价时,才会进行插入(
map容器中的键是唯一的)。
在内部,映射容器按照其比较对象指定的标准,按它们的键对所有元素排序。元素总是按照此顺序插入到其各自的位置。
通过调用
allocator_traits::construct并传递
args来构造元素。
存在一个类似的成员函数
insert,它复制或移动现有的对象到容器中。
☲ 参数
-
args
-
C++11: 用于构造新元素的参数。
C++14: 被转发来构造新元素(类型pair<const key_type, mapped_type>)的参数。
这可以是:
- 两个参数:一个为键,另一个为映射的值。
- pair类型的单个参数,键值作为第一个成员,映射值作为第二个成员。
- piecewise_construct作为第一个参数,另外两个元组参数分别作为键值和映射值的参数转发。
请参阅pair::pair了解更多信息。
☉ 返回值
如果函数成功插入元素(因为集合中已经没有等效的元素),则函数返回一个
pair迭代器到新插入的元素,并返回
true值。
否则,它返回一个指向容器中等效元素的迭代器,并返回一个
false值。
成员类型迭代器是指向元素的双向迭代器类型。
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;
}
|
输出:
mymap contains: [x:100] [y:200] [z:100]
✥ 复杂度
容器大小:对数。
☣ 迭代器的有效性
不变.
⇄ 数据竞争
容器被修改。
并发地访问现有元素是安全的,但迭代容器中的范围则不安全。
☂ 异常安全性
强保证:如果抛出异常,容器中不会有任何变化。
如果allocator_traits::construct不支持相应的参数,它会导致未定义行为。
🍄 另请参阅
map::emplace_hint |
构造插入元素并加提示(公众成员函数) |
map::insert |
插入元素(公众成员函数) |
map::erase |
删除元素(公众成员函数) |