Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

map::emplace_hint

公众成员函数  <map>
template <class... Args>
  iterator emplace_hint (const_iterator position, Args&&... args);

构造插入元素并加提示

如果新元素的键是唯一的,则在映射中插入新元素,并提供关于插入位置的提示。 这个新元素是使用args作为value_type(它是pair类型的对象)构造的参数即时构造的

只有当容器中没有与被放置的元素相等的其他元素时,插入才会发生(map容器中的元素是唯一的)。

position中的值用作插入点上的提示。尽管如此, 元素仍将按照其内部比较对象描述的顺序插入到其相应的位置, 但这个提示使用函数插入点开始搜索,当实际插入点位于该位置或接近该位置时,该过程将大大加快。

该元素通过调用allocator_traits::construct函数即时构造,参数被转发。

☲  参数


position
元素可插入位置的提示。

如果位置指向插入元素后面的元素(如果是最后一个元素,则指向end),则该函数优化其插入时间.

注意,这并不强制新元素位于映射容器中的那个位置(映射中的元素总是遵循特定的顺序)。

Const_iterator是一个成员类型,定义为指向元素的双向迭代器类型。
args
C++11: 参数,用于为插入的元素构造映射类型的新对象。

C++14: 被转发来构造新元素(类型pair<const key_type, mapped_type>)的参数。
这可以是:
- 两个参数:一个为键,另一个为映射的值。
- pair类型的单个参数,键值作为第一个成员,映射值作为第二个成员。
- piecewise_construct作为第一个参数,另外两个元组参数分别作为键值和映射值的参数转发。
请参阅pair::pair了解更多信息。

☉  返回值



如果函数成功插入元素(因为映射中已经没有等效的元素),则函数返回一个迭代器到新插入的元素。

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

成员类型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;
}

输出:
mymap contains: [a:12] [b:10] [c:14]

✥ 复杂度



一般来说,容器大小为对数。
如果元素的插入点是 position,则为平摊常数。

☣ 迭代器的有效性



不变.

⇄ 数据竞争


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

☂ 异常安全性



强保证:如果抛出异常,容器中不会有任何变化。
如果allocator_traits::construct不支持相应的参数,它会导致未定义行为。

🍄  另请参阅



map::emplace 构造插入元素(公众成员函数)
map::insert 插入元素(公众成员函数)
map::erase 删除元素(公众成员函数)

联系我们 免责声明 关于CandCplus 网站地图