最近做刷题,需要用到一个互斥且递增的容器。顺手就写了一个unordered_set
,然后调了很久最后发现得用set
那么他们的区别是什么?
顾名思义,unordered_set
容器中的key是无序的,就不满足上述递增要求了,而set
能保证容器中key有序。
他们的区别要从底层实现说起。
为什么set
能保持有序,因为底层基于RB-Tree,天然的有序结构,而unordered_set
底层则是hashtable。
记得当时用unordered_set
做class
或者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