C++ set和unordered_set

本文对比了C++标准库中的set与unordered_set两种容器。set基于红黑树实现,能够保持元素有序;而unordered_set基于哈希表,不保证元素顺序,但在查找效率上有优势。通过示例代码展示了两者的使用差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做刷题,需要用到一个互斥且递增的容器。顺手就写了一个unordered_set,然后调了很久最后发现得用set

那么他们的区别是什么?
顾名思义,unordered_set容器中的key是无序的,就不满足上述递增要求了,而set能保证容器中key有序。

他们的区别要从底层实现说起。

为什么set能保持有序,因为底层基于RB-Tree,天然的有序结构,而unordered_set底层则是hashtable。

记得当时用unordered_setclass或者struct的容器时就得实现特定的hash函数,当元素较少、hash bucket很多的时候,负载因子很小,发生冲突的概率很小,这样保证了unordered_set的查找效率。因此,在负载因子大于某个常数(1或者0.75)就需要对哈希表进行扩容。

下面一个测试看出在使用上set和unordered_set区别

int main()
{
    set<int>s1;
    unordered_set<int>s2;
    s1.insert(4);
    s1.insert(2);
    s1.insert(3);
    s1.insert(1);
    s2.insert(4);
    s2.insert(2);
    s2.insert(3);
    s2.insert(1);
    for(auto it=s1.begin();it!=s1.end();++it)
        cout<<*it<<" ";
    cout<<endl;
    for(auto it=s2.begin();it!=s2.end();++it)
        cout<<*it<<" ";
    cout<<endl;
}
//输出:
//1 2 3 4
//1 3 2 4
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值