set和unordered_set的区别
-
set
基于红黑树实现,实现了红黑树的平衡二叉搜索树数据结构,并且具有自动排序功能,set
内的所有数据在任何时候都是有序的。 -
unordered_set
基于哈希表,数据插入和查找的时间复杂度很低,几乎为常数时间,但是内存消耗比较大,也没有自动排序的功能。底层实现用一个下标索引范围比较大的数组保存元素,形成很多的桶,键值通过哈希函数映射到不同区域进行保存。 -
下面举例讲解
set
和unordered_set
的使用(以vector<int>
为例):
set<vector<int>> s0; // 因为vector重载了operator<,因此可以作为set的key
但是如果直接使用unordered_set<vector<int>> s1;
会报错,因为vector没有哈希函数,此时需要自己定义一个,如下:
struct vectorHasher {
hash<int> hasher;
size_t seed = 0;
size_t operator() (const vector<int>& v) const {
for(auto i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
return seed;
}
};
使用方式如下:
unordered_set<vector<int>, vectorHasher> s;
s.insert({1, 2});
s.insert({1, 3});