关于SET和UNORDER_SET

最近做刷题,需要用到一个互斥且递增的容器。顺手就写了一个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

猜你喜欢

转载自blog.csdn.net/qq_18539301/article/details/80283554
set
今日推荐