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