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

std::

unordered_map::insert

公众成员函数  <unordered_map>
(1)
pair<iterator,bool> insert (const value_type& val);
(2)
template <class P>
    pair<iterator,bool> insert ( P&& val );
(3)
iterator insert ( const_iterator hint, const value_type& val );
(4)
template <class P>
    iterator insert ( const_iterator hint, P&& val );
(5)
template <class InputIterator>
    void insert ( InputIterator first, InputIterator last );
(6)
void insert ( initializer_list<value_type> il );

插入元素

unordered_map中插入新元素。

只有当元素的键与容器中其他元素的键不相等时,才会插入元素(unordered_map中的键是唯一的)。

形参决定插入多少个元素以及初始化它们的值:

☲  参数


val
要复制(或移动)到插入元素中的值。
版本(1)和(3)复制元素(val继续保存其内容,容器保存其副本)。
版本(2)和(4)移动元素(也就是说,val失去了它的内容,由容器中的新元素获取)。
成员类型value_type是容器中元素的类型,在unordered_map中定义为 pair<const key_type,mapped_type>,其中成员类型key_type是第一个模板参数(密钥类型)的别名, 而mapped_type是第二个模板参数(映射类型,T)的别名。

C++11: 接受类型为P&&的参数的签名只有在P是一个可隐式转换为value_type的类型时才会被调用.

C++14: 只有当std::is_constructible<value_type,P&&>为真时, 才会调用接受类型为P&&的参数的签名。
hint
迭代器指向一个建议的位置,提示从哪里开始搜索合适的插入点。 容器可能会使用这个值来优化操作,也可能不会。不管传递了什么提示,元素都将存储在相应的bucket中.

成员类型const_iterator是前向迭代器类型。
first, last
指定元素范围的迭代器。将[first,last)范围内元素的副本插入容器中。
使用的范围是[first,last),它包括firstlast之间的所有元素, 包括first指向的元素,但不包括last指向的元素。

firstlast都不应该是目标容器中的迭代器。
模板类型可以是任何类型的输入迭代器。
il
一个initializer_list对象。编译器将自动从初始化器列表声明器构造此类对象。
成员类型value_type是容器中元素的类型,定义在unordered_map的 pair< key_type const, mapped_type >,其中成员类型key_type是第一个模板参数(Key类型)的别名, 而mapped_type是第二个模板参数(mapped 类型,T)的别名。

☉  返回值



在版本(1)和(2)中,函数返回一个pair对象,其第一个元素是指向容器中新插入的元素或键值相等的元素的迭代器, 并返回bool值,指示该元素是否成功插入。

在版本(3)和(4)中,函数返回一个迭代器,指向容器中新插入的元素或键值相等的元素。

版本(5)和(6)没有返回值。

成员类型iterator是前向迭代器类型.

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

☣  示例



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

int main ()
{
  std::unordered_map<std::string,double>
              myrecipe,
              mypantry = {{"milk",2.0},{"flour",1.5}};

  std::pair<std::string,double> myshopping ("baking powder",0.3);

  myrecipe.insert (myshopping);                        // copy insertion
  myrecipe.insert (std::make_pair<std::string,double>("eggs",6.0)); // move insertion
  myrecipe.insert (mypantry.begin(), mypantry.end());  // range insertion
  myrecipe.insert ( {{"sugar",0.8},{"salt",0.1}} );    // initializer list insertion

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

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

输出:
myrecipe contains:
salt: 0.1
eggs: 6
sugar: 0.8
baking powder: 0.3
flour: 1.5
milk: 2

✥ 复杂度


单元素插入:
平均情况下:插入元素的数量呈线性。
最坏情况::N*(size+1),插入的元素数量乘以容器大小再加1。
多个元素插入:
平均情况:插入元素的数量呈线性。
最坏情况:N*(size+1):插入的元素数量乘以容器大小再加1。

可能会触发重新hash(不包括)。

☣ 迭代器的有效性



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

如果插入操作后的新容器大小超过其容量阈值(计算方法为容器的bucket_count乘以其max_load_factor),则强制进行rehash。

对unordered_map容器中的元素的引用在所有情况下仍然有效,即使在rehash之后也是如此。

🍄  另请参阅



unordered_map::erase 删除元素(公众成员函数)
unordered_map::emplace 构造和插入元素(公众成员函数)
unordered_map::emplace_hint 构造和插入元素并加提示(公众成员函数)
unordered_map::operator= 复制容器内容(公众成员函数)

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