std::unordered_map::insert
STD:无序[医]地图::插入
std::pair | (1) | (since C++11) |
---|---|---|
template< class P > std::pair<iterator,bool> insert( P&& value | (2) | (since C++11) |
std::pair<iterator,bool> insert( value_type&& value | (2) | (since C++17) |
iterator insert( const_iterator hint, const value_type& value | (3) | (since C++11) |
template< class P > iterator insert( const_iterator hint, P&& value | (4) | (since C++11) |
iterator insert( const_iterator hint, value_type&& value | (4) | (since C++17) |
template< class InputIt > void insert( InputIt first, InputIt last | (5) | (since C++11) |
void insert( std::initializer_list<value_type> ilist | (6) | (since C++11) |
insert_return_type insert(node_type&& nh | (7) | (since C++17) |
iterator insert(const_iterator hint, node_type&& nh | (8) | (since C++17) |
在容器中插入元素%28s%29,如果容器%27T已经包含具有等效键的元素。
1-2%29次插入value.过载%282%29相等于emplace(std::forward<P>(value))并且只参与过载解决方案。std::is_constructible<value_type, P&&>::value==true...
3-4%29次插入value,使用hint作为一个不具约束力的建议,搜索应该从哪里开始。重载%284%29相当于emplace_hint(hint,std::forward<P>(value))并且只参与过载解决方案。std::is_constructible<value_type, P&&>::value==true...
5%29插入范围内的元素[first, last)
如果区域中的多个元素具有比较等效的键,则未指定插入了%28挂起的元素。LWG2844%29
6%29从初始化程序列表插入元素ilist
如果区域中的多个元素具有比较等效的键,则未指定插入了%28挂起的元素。LWG2844%29
7%29nh
是空的节点手柄什么都不做。否则,插入nh
在容器中,如果容器%27T已经包含了一个元素,其密钥相当于nh.key()
如果nh
不是空的get_allocator() != nh.get_allocator()
...
8%29nh
是空的节点手柄,什么也不做,并返回结束迭代器。否则,插入nh
在容器中,如果容器%27T已经包含了一个元素,其密钥相当于nh.key()
,并返回指向元素的迭代器,该元素的键等价于nh.key()
%28无论插入是否成功,%29。如果插入成功,nh
,否则它将保留元素的所有权。元素被插入到hint
如果nh
不是空的get_allocator() != nh.get_allocator()
...
如果由于插入而发生重散列,则所有迭代器都将失效。否则迭代器不会受到影响。引用不失效。只有当新元素数大于max_load_factor()*bucket_count()
如果插入成功,则在节点句柄中保存时获得的元素的指针和引用无效,并且在提取该元素之前获得的指针和引用变得有效。%28自C++17%29。
参数
hint | - | iterator, used as a suggestion as to where to insert the content |
---|---|---|
value | - | element value to insert |
first, last | - | range of elements to insert |
ilist | - | initializer list to insert the values from |
nh | - | a compatible node handle |
类型要求
-输入必须符合输入器的要求。
返回值
1-2%29将由迭代器组成的一对迭代器返回到插入元素%28或阻止插入%29的元素和bool
表示插入是否发生。
3-4%29将迭代器返回到插入的元素或阻止插入的元素。
5-6%29%280%29
7%29返回insert_return_type
成员初始化如下:nh
是空的,inserted
是false
,,,position
是end()
,和node
是空的。否则如果插入发生,inserted
是true
,,,position
指向插入的元素,以及node
是空的。如果插入失败,inserted
是false
,,,node
具有以前的值nh
,和position
指向一个元素,该元素的键等价于nh.key()
...
8%29端迭代器nh
为空,迭代器指向插入的元素(如果发生插入),迭代器指向的元素的键相当于nh.key()
如果失败了。
例外
1-4%29如果任何操作引发异常,则插入无效。
复杂性
1-4%29例平均病例:O(1)
,最坏的情况O(size())
5-6%29例平均病例:O(N)
,其中N是要插入的元素数。更糟的情况:O(N*size()+N)
7-8%29例平均病例:O(1)
,最坏的情况O(size())
注记
暗示的插入%283,4%29不返回布尔值,以便与顺序容器上的位置插入兼容,例如std::vector::insert
这样就可以创建泛型插入器,例如std::inserter
.检查暗示插入的成功的一种方法是比较尺寸%28%29前后。
例
二次
#include <string>
#include <iostream>
#include <unordered_map>
int main ()
{
std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}};
dict.insert{3, "three"}
dict.insert(std::make_pair(4, "four")
dict.insert{{4, "another four"}, {5, "five"}}
bool ok = dict.insert{1, "another one"}).second;
std::cout << "inserting 1 -> \"another one\" "
<< (ok ? "succeeded" : "failed") << '\n';
std::cout << "contents:\n";
for(auto& p: dict)
std::cout << " " << p.first << " => " << p.second << '\n';
}
二次
可能的产出:
二次
inserting 1 -> "another one" failed
contents:
5 => five
1 => one
2 => two
3 => three
4 => four
二次
另见
emplace | constructs element in-place (public member function) |
---|---|
emplace_hint | constructs elements in-place using a hint (public member function) |
insert_or_assign (C++17) | inserts an element or assigns to the current element if the key already exists (public member function) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。