C++ unordered_map
1、unordered_map简介
unordered_map是C++11正式加入的对hash_map的官方实现。元素在内部不以任何特定顺序排序,而是放进桶中。元素放进哪个桶完全依赖于其键的hash。这允许对单独元素的快速访问,因为一旦计算hash,则它准确指代元素所放进的桶。但unordered_map搜索、插入和元素移除拥有平均常数时间复杂度。
2、头文件
#include <unordered_map>
3、成员函数
成员函数 | 函数功能 |
---|---|
insert | 在unordered_map中插入元素。 |
emplace | 构造新元素并将其插入unordered_map。 |
emplace_hint | 通过提示构造新元素并将其插入unordered_map。 |
find | 搜索具有给定键的元素。 |
begin | 返回指向unordered_map中第一个元素的迭代器。 |
end | 返回指向末尾的迭代器。 |
cbegin | 返回指向unordered_map中第一个元素的const迭代器。 |
cend | 返回指向末尾的常量迭代器。 |
clear | 删除unordered_map的所有元素。 |
size | 返回unordered_map中的元素数。 |
max_size | 返回unordered_map的最大容量。 |
count | 返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。 |
empty | 如果unordered_map为空,则返回true。 |
erase | 从unordered_map上删除元素。 |
upper_bound | 返回第一个大于值val的位置 |
lower_bound | 返回第一个大于等于值val的位置 |
swap | 交换unordered_map内容。 |
at | 用给定的键检索元素。 |
bucket_count | 返回槽(Bucket)数 |
max_bucket_count | 返回最大槽数 |
bucket_size | 返回槽大小 |
bucket | 返回元素所在槽的序号 |
load_factor | 返回载入因子,即一个元素槽(Bucket)的最大元素数 |
max_load_factor | 返回或设置最大载入因子 |
rehash | 设置槽数 |
reserve | 请求改变容器容量 |
3.1 插入操作
unordered_map<int, string> m;
// 如果已经存在键值 1,则会作赋值修改操作,如果没有则插入
m[1] = "zhangsan";
// 插入单个键值对,并返回插入位置和成功标志,插入位置已经存在值时,插入失败
pair<iterator,bool> insert (const value_type& val);
//在指定位置插入,在不同位置插入效率是不一样的,因为涉及到重排
iterator insert (const_iterator position, const value_type& val);
// 插入多个
void insert (InputIterator first, InputIterator last);
//c++11开始支持,使用列表插入多个
void insert (initializer_list<value_type> il);
3.2 取值操作
unordered_map中元素取值主要有at和[ ]两种操作。
unordered_map<int, string> m;
cout << m[1] << endl;
cout << m.at(1) << endl;
3.3 容量查询
// 查询unordered_map是否为空
bool empty();
// 查询unordered_map中键值对的数量
size_t size();
// 查询unordered_map所能包含的最大键值对数量,和系统和应用库有关。
// 此外,这并不意味着用户一定可以存这么多,很可能还没达到就已经开辟内存失败了
size_t max_size();
// 查询关键字为key的元素的个数,在unordered_map里结果非0即1
size_t count(const Key& key) const; //
3.4 删除操作
// 删除迭代器指向位置的键值对,并返回一个指向下一元素的迭代器
iterator erase( iterator pos )
// 删除一定范围内的元素,并返回一个指向下一元素的迭代器
iterator erase( const_iterator first, const_iterator last );
// 根据Key来进行删除, 返回删除的元素数量,在unordered_map里结果非0即1
size_t erase( const key_type& key );
// unordered_map,清空后的size为0
void clear();
3.5 查找操作
// 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
// 根据unordered_map的类型,返回的迭代器为 iterator 或者 const_iterator
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;