C++

set和unordered_set的区别

  1. set基于红黑树实现,实现了红黑树的平衡二叉搜索树数据结构,并且具有自动排序功能,set内的所有数据在任何时候都是有序的。

  2. unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎为常数时间,但是内存消耗比较大,也没有自动排序的功能。底层实现用一个下标索引范围比较大的数组保存元素,形成很多的桶,键值通过哈希函数映射到不同区域进行保存。

  3. 下面举例讲解setunordered_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});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值