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

C++官网参考链接:https://cplusplus.com/reference/map/map/emplace_hint/

公有成员函数
<map>
std::map::emplace_hint
template <class... Args>  iterator emplace_hint (const_iterator position, Args&&... args);
构造并插入带有提示的元素
如果新元素的键是唯一的,则在map中插入新元素,并提示其插入position。这个新元素是使用args作为构造value_type(这是一个pair类型的对象)的实参来就地构造的。
只有在容器中没有其他元素具有与被放置的元素相同的键时(map容器中的元素是唯一的),才会进行插入。
如果插入,这将有效地使容器的size增加1。
position中的值用作插入点的提示。尽管如此,元素仍然会按照其内部比较对象(comparison object)所描述的顺序被插入到相应的位置,但函数使用这个提示开始搜索插入点,当实际插入点位于该position或接近该position时,会大大加快搜索速度。
元素是通过调用具有转发的args的allocator_traits::construct就地构造的。

形参 
position 
提示可以插入元素的位置。
如果position指向插入元素后的元素(如果是最后一个元素,则指向end),则函数优化其插入时间。
注意,这并不强制新元素位于map容器中的该位置(map中的元素总是遵循特定的顺序)。
const_iterator是一个成员类型,定义为指向元素的双向iterator(bidirectional iterator)类型。
args
C++11
用于为插入的元素构造映射类型的新对象的实参。
C++14
为构造新元素而转发的实参(类型pair<const key_type, mapped_type>)。
这可以是: 
- 两个实参:一个用于键,另一个用于映射值。
- pair类型的单个实参,键的值作为first成员,映射的值作为second成员。
- piecewise_construct作为第一个实参,另外两个tuples实参分别转发作为键值和映射值的实参。
更多信息请参见pair::pair

返回值
如果函数成功插入元素(因为map中没有等价的元素),则函数返回指向新插入元素的iterator。
否则,它将返回指向容器内等价元素的iterator。
成员类型iterator是指向元素的双向iterator(bidirectional iterator)类型。

用例
// map::emplace_hint
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;
  auto it = mymap.end();

  it = mymap.emplace_hint(it,'b',10);
  mymap.emplace_hint(it,'a',12);
  mymap.emplace_hint(mymap.end(),'c',14);

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

  return 0;
}
输出:

复杂度
通常来说,容器的size中的对数。
如果元素的插入点是position,则平摊常量。

iterator的有效性
没有变化。

数据竞争
完成容器的修改。
同时访问现有的元素是安全的,但是迭代容器中的范围就不安全了。

异常安全
强保证:如果抛出异常,则容器中不会有任何更改。
如果适当的实参不支持allocator_traits::construct,则会导致未定义的行为。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值