C++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中还要提供rdered系列容器呢?

原因是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系列容器.

猜你喜欢

转载自blog.csdn.net/m0_63300413/article/details/130245238