当前位置:首页 » 《随便一记》 » 正文

C++ Reference: Standard C++ Library reference: Containers: map: map: emplace

25 人参与  2022年12月17日 15:29  分类 : 《随便一记》  评论

点击全文阅读


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,则会导致未定义的行为。


点击全文阅读


本文链接:http://zhangshiyu.com/post/49936.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1