最近做刷题,需要用到一个互斥且递增的容器。顺手就写了一个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
本文对比了C++标准库中的set与unordered_set两种容器。set基于红黑树实现,能够保持元素有序;而unordered_set基于哈希表,不保证元素顺序,但在查找效率上有优势。通过示例代码展示了两者的使用差异。
6844





