一、Unordered Containers
1. 介绍
和关联式容器一样,无序容器也使用键值对(pair 类型)的方式存储数据,和关联式容器相比,无序容器具有以下 2 个 特点:
- 无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键
- 和关联式容器相比,无序容器擅长通过指定键查找对应的值(平均时间复杂度为 O(1));
- 但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器。
2. 分类
Containers | Functions |
---|---|
unordered_map | 存储键值对 <key, value> 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的 |
unordered_multimap | 和 unordered_map 唯一的区别在于,该容器允许存储多个键相同的键值对。 |
unordered_set | 不再以键值对的形式存储数据,而是直接存储数据元素本身(可理解为:该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。容器存储的元素不能重复,且容器内部存储的元素也是无序的。 |
unordered_multiset | 和 unordered_set 唯一的区别在于,该容器允许存储值相同的元素。 |
也就是说,C++ 11 标准的 STL 中,在已提供有 4 种关联式容器的基础上,又新增了各自的“unordered”版本(无序版本、哈希版本),提高了查找指定元素的效率。
3. 查找复杂度:
vector
、list
、deque
:O(n)- Associative Containers(
set
、map
):O(log n) Unordered Containers
:O(1) —— 利用了哈希表查找
二、unordered_set
注意:使用前需包含 unordered_set
头文件(unrdered_multiset也在其中)
#include <unordered_set>
#include <bits/stdc++.h> // 万能
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
unordered_set<int> s;
s.insert(1);
s.insert(5);
s.insert(1); // repeat
s.insert(2);
s.insert(4);
for (auto elem : s){
cout << elem << " ";
}
cout << endl;
for (unordered_set<int>::iterator it=s.begin(); it!=s.end(); it++){
cout << *it << " ";
}
cout << endl;
auto it = s.find(2);
if (it != s.end()){
cout << "Successfully!";
}
return 0;
}
输出结果为: 不允许元素重复、无序
4 2 5 1
4 2 5 1
Successfully!
--------------------------------
Process exited after 0.8331 seconds with return value 0
三、unordered_map
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<int, string> umap;
umap[1] = "aaaa";
umap.insert(pair<int, string>(5, "bloom"));
umap.insert(std::make_pair(3, "green"));
umap[3] = "hot"; // modefy
for (auto elem : umap){
cout << elem.first << " " << elem.second << endl;
}
cout << endl;
if (umap.find(3) != umap.end()){
cout << (umap.find(3))->second;
}
return 0;
}
结果如下:
3 hot
5 bloom
1 aaaa
hot
unordered_set
、unordered_map
、unordered_multiset
、unordered_multimap
的用法和之前的有序容器类似,只是元素存储时无序,查找效率高