文章目录
- map/set与unordered系列的区别
- map/set与unordered系列的性能对比
- 测试总结
map/set与unordered系列的区别
1: map/set遍历时是有序的,unordered_map/unordered_set遍历时是无序的.
以set和unordered_set容器为例:
2: map/set是双向迭代器,底层数据结构为红黑树,unordered系列是单项迭代器.底层数据结构为哈希表/散列表.
map/set与unordered系列的性能对比
基于上面的区别,相比而言,map/set更加强大,那么为什么在C++11中还要提供unordered系列容器呢?
原因是unordered系列在增删查改中的效率比map/set对的效率更高.
以下我们分别测试了分别使用unordered set 与 set 容器的增删查改,并分别记录所耗时间进行比较:
int main()
{
int n = 10000000;
vector<int> v;
v.reserve(n);
srand(time(NULL)); //随机生成n个数字
for (int i = 0; i < n; i++)
{
v.push_back(rand()+i); //将随机产生的10000个数据插入到vector容器中.
}
//插入
set<int> s;
clock_t begin1 = clock();
for (auto e : v)
{
s.insert(e); //将n个数据插入到set容器中
}
clock_t end1 = clock();
unordered_set<int> us;
clock_t begin2 = clock();
for (auto e : v)
{
us.insert(e); //将n个数插入unordered_set容器
}
clock_t end2 = clock();
cout << "set insert: " << end1 - begin1 << endl; //记录插入到容器set所需要的时间.
cout << "unordered_set insert: " << end2 - begin2 << endl; //记录插入容器unordered_set容器所需要的时间.
//查找
clock_t begin3 = clock();
for (auto e : v)
{
s.find(e); //在set容器中查找这n个数
}
clock_t end3 = clock();
clock_t begin4 = clock();
for (auto e : v)
{
us.find(e); //在unordered_set容器中查找这n个数
}
clock_t end4 = clock();
//分别输出在set容器和unordered_set容器中查找这N个数所用的时间
cout << "set find: " << end3 - begin3 << endl;
cout << "unordered_set find: " << end4 - begin4 << endl;
//删除
clock_t begin5 = clock();
for (auto e : v)
{
s.erase(e); //将这n个数从set容器中删除
}
clock_t end5 = clock();
clock_t begin6 = clock();
for (auto e : v)
{
us.erase(e); //将这n个数从unordered_set容器中删除
}
clock_t end6 = clock();
//分别记录将这N个数从set容器和unordered_set容器中删除所用的时间
cout << "set erase: " << end5 - begin5 << endl;
cout << "unordered_set erase: " << end6 - begin6 << endl;
return 0;
}
运行结果如下:
当我们使用Debug版本测试数据为10000时,发现set 与 unordered_set的性能差距并不大.
我们所写程序一般为release版本,当我们使用该版本,测试数据为10000时,发现二者的性能都得到了优化,其中unorder_set在查找,删除中更是优化到了0毫秒!
当我们使用Debug版本测试数据为100000时,发现set插入效率与unordered_set相差不大,但是查找效率中,unordered_set是set的3倍,删除效率中,unordered_set是set的6倍.
在Realse版本中,测试数据为100000时,unordered_set综合效率也明显由于set.
测试总结
1: 当我们处理数据数量较小的数据时,map/set与unordered系列在增删查改的效率差距不大.
2: 但我们处理数据量较大的数据时,unordered系列在增删查改的效率比set/map的效率更高,性能更强.
3: 除非我们需要在遍历容器时数据是有序的一般采用map/set,否则一般采用unordered系列容器.