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

std::

unordered_map::emplace

公众成员函数  <unordered_map>
template <class... Args>
  pair<iterator,bool> emplace (Args&&... args);

构造并插入元素

unordered_map中插入一个新元素,如果它的键值是唯一的。 这个新元素是使用args作为元素构造函数的参数构造的。

只有当容器中没有与被放置的元素的键相等的其他键时,插入才会发生(unordered_map容器中的键是唯一的)。
存在一个类似的成员函数,insert,它复制或移动现有的对象到容器中。

☲  参数


args
C++11: 参数,用于为插入的元素构造映射类型的新对象。
C++14: 被传递来构造新元素(类型 pair<const key_type, mapped_type>)的参数。
这可以是:
  • 两个参数:一个用于键,另一个用于映射的值。
  • pair类型的单个参数,键的值作为第一个成员,映射值的值作为第二个成员。
  • Piecewise_construct作为第一个参数,另外两个带有tuples的参数分别作为键值和映射值的参数转发。

请参阅pair::pair了解更多信息。

☉  返回值



如果函数成功插入元素(因为不存在具有相同键的其他元素),则函数返回一个pair对象, 其第一个组件是被插入元素的迭代器,第二个组件为true

否则,返回的pair对象的第一个组件是指向容器中具有相同键值的元素的迭代器,第二个组件为false

unordered_map容器中的所有迭代器都具有对元素的const访问权限:元素可以插入或移除,但不能在容器中修改。
成员类型iterator 是指向元素的前向迭代器类型。

使用allocator_traits<allocator_type>::construct()分配新元素的存储, 失败时可能抛出异常(对于默认分配器,如果分配请求不成功则抛出bad_alloc)。

☣  示例



// unordered_map::emplace
#include <iostream>
#include <string>
#include <unordered_map>

int main ()
{
  std::unordered_map<std::string,std::string> mymap;

  mymap.emplace ("NCC-1701", "J.T. Kirk");
  mymap.emplace ("NCC-1701-D", "J.L. Picard");
  mymap.emplace ("NCC-74656", "K. Janeway");

  std::cout << "mymap contains:" << std::endl;
  for (auto& x: mymap)
    std::cout << x.first << ": " << x.second << std::endl;

  std::cout << std::endl;
  return 0;
}

输出:
mymap contains:
NCC-1701: J.T. Kirk
NCC-1701-D: J.L. Picard
NCC-74656: K. Janeway

✥ 复杂度



平均情况下:常数。
最坏情况:容器大小呈线性。
可能会触发重新hash(不包括)。

☣ 迭代器的有效性



在大多数情况下,容器中的所有迭代器在插入之后仍然有效。唯一的例外是容器的增长迫使重新hash。 在这种情况下,容器中的所有迭代器都失效。

如果插入操作后的新容器大小超过其容量阈值(计算方法为容器的bucket_count乘以其max_load_factor), 则强制进行rehash。
对unordered_map容器中的元素的引用在所有情况下仍然有效,即使在重新散列之后也是如此。

🍄  另请参阅



unordered_map::find 获取元素的迭代器(公众成员函数)
unordered_map::insert 插入元素(公众成员函数)

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