公有成员函数
<map>

std::map::emplace_hint

template <class... Args>  iterator emplace_hint (const_iterator position, Args&&... args);
带提示构建并插入元素
如果键是唯一的,则在 map 中插入一个新元素,并给出插入*位置*的提示。此新元素使用*args*作为构造一个value_type(它是*pair*类型的对象)的参数来就地构造。

只有当容器中没有其他元素的键与要emplaced 的键等效时,才会进行插入(map 容器中的元素是唯一的)。

如果成功插入,容器的*size*将增加一。

*position*中的值用作插入点的提示。该元素仍将插入到其对应的位置,遵循其内部*comparison object*描述的顺序,但该提示用于函数开始搜索插入点,当实际插入点是*position*或接近它时,可以大大加快该过程。

通过调用*args*转发的*allocator_traits::construct*在原地构造元素。

参数

position
元素可插入位置的提示。
如果*position*指向将要插入元素的元素(或指向*end*,如果它将是最后一个),则该函数会优化其插入时间。
请注意,这不会强制将新元素放置在 map 容器内的该位置(map 中的元素始终遵循特定顺序)。
const_iterator是一个成员类型,定义为指向元素的 双向迭代器类型。
args
用于构造插入元素的新*mapped type*对象的参数。
转发给新元素(类型为pair<const key_type, mapped_type>)构造的参数。
这可以是以下之一:
- 两个参数:一个用于*key*,一个用于*mapped value*。
- 一个*pair*类型的单个参数,其第一个成员为*key*值,第二个成员为*mapped value*值。
- 第一个参数为*piecewise_construct*,另外两个参数为*tuples*,分别转发给*key value*和*mapped value*的构造函数参数。
有关更多信息,请参阅*pair::pair*。

返回值

如果函数成功插入元素(因为 map 中已不存在等效元素),则函数返回一个指向新插入元素的迭代器。

否则,它返回一个指向容器中等效元素的迭代器。

成员类型iterator是一个指向元素的*双向迭代器*类型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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;
}
输出
mymap contains: [a:12] [b:10] [c:14]


复杂度

通常,与容器*size*的对数成比例。
如果元素的插入点是 position,则为摊销常数复杂度。

迭代器有效性

没有变化。

数据竞争

容器已被修改。
并发访问现有元素是安全的,但迭代容器中的范围则不是。

异常安全

强保证:如果抛出异常,容器没有发生变化。
如果*allocator_traits::construct*不支持适当的参数,则会导致*未定义行为*。

另见