C++map/set与unordered系列的区别

news2024/12/27 12:30:36

文章目录

  • 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系列容器.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重磅 | Shifu物联网开发框架成为CNCF认证项目

近日&#xff0c;边无际Shifu项目被收录进CNCF云原生全景图&#xff0c;成为了云原生计算基金会认证的项目之一。此次收录证明了Shifu具备了符合CNCF标准的技术能力和良好的社区发展&#xff0c;展现了Shifu在云原生计算领域的实力和可信度&#xff0c;巩固了Shifu在云原生领域…

J2EE,Java EE,Jakarta EE 命名之间的恩恩怨怨

介绍 简单来说&#xff0c;上面所有的名字指的都是一个东西 Java Platform, Enterprise Edition 上面的几个名词都是下面的内容的简写&#xff1a; J2EE(Java 2 Platform, Enterprise Edition)Java EE (Java Platform, Enterprise Edition)Jakarta EE(Jakarta Enterprise Edi…

learn_C_deep_1 (C程序补充知识、变量的声明和定义、声明和定义的区别)

目录 C程序补充知识 变量的声明和定义 1.什么是变量&#xff1f; 2.变量的本质是什么&#xff1f; - 所有的变量都要在内存的某个位置开辟空间 3.变量的定义和声明形式、初始化和赋值的区别 4.为什么要定义变量 声明和定义的区别 C程序补充知识 先让我们来看一段C语言…

史上最严宝宝口粮新国标出台,DHA和维生素D可能无需额外补充了

自2023年2月22日起&#xff0c;我国婴幼儿配方食品&#xff08;以下简称配方奶&#xff09;新国标开始实施。这意味着2023年2月22日以后在中国上架销售的配方奶必须符合新国标&#xff0c;重新取得国家市场监督管理总局食品评审中心&#xff08;CFE-SAMR&#xff09;的注册。这…

【单片机】基于Arduino cli和VS Code配置开发环境,彻底抛弃Arduino IDE

文章目录 0 前言1 VS Code的优势和Arduino IDE的劣势2 前期准备3 Arduino cli3.1 Arduino cli是什么3.2 下载与安装3.3 基本使用3.4 开发环境配置 4 VS Code配置5 参考链接 0 前言 之前有在电脑上基于VS Code配置Arduino环境&#xff0c;大致方法就是在安装Arduino IDE的前提下…

SCT2650STER,可以实现低成本升降压

市面上主流的中高压升降压拓扑方案有四开关管升降压控制芯片、SEPIC/反激控制芯片等。实际上四开关管升降压芯片成本很高&#xff0c;而SEPIC/反激控制芯片设计复杂。 如果仅需要升降压功能&#xff0c;功率较小&#xff0c;不需要隔离时&#xff0c;本篇解决方案将以SCT2650为…

真题详解(地址索引)-软件设计(五十一)

真题详解&#xff08;单元测试&#xff09;-软件设计&#xff08;五十)https://blog.csdn.net/ke1ying/article/details/130189173?spm1001.2014.3001.5501 指令寻址方式 有四种&#xff0c;直接寻址&#xff0c;寄存器寻址&#xff0c;隐含寻址&#xff0c;立即寻址。 按寻…

基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

【2SFCA的基本思路,可以略过】 对每个供给点j,搜索所有在j搜寻半径(d0)范围内的需求点(k),计算供需比Rj;对每个需求点i,搜索所有在i搜寻半径(d0)范围内的供给点(j),将所有的供需比Rj加总得到i点的可达性Ai。 【数据】 成都市城区绿地数据、各街道小区数据、路网…

基于Rush.js的Monorepo实战

基于Rush.js的Monorepo入门实战 概述 Monorepo是一种软件开发模式&#xff0c;它将多个项目或组件存储在同一个代码库中&#xff0c;而不是将它们分散到多个库中。这样做可以方便跨项目的代码重用、版本控制、依赖管理等&#xff0c;被广泛应用于大型软件公司的开发流程中。 …

动力节点Vue3笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;对我们编写Vue程序起不到太大的作用&#xff0c;…

C语言从入门到精通第4天(1~3天的扩展)

1~3天的扩展 拓展数据类型sizeof关键字整型数据的打印格式字符类型的输出格式ASCII码表转义字符进制 拓展数据类型 在开发过程中我们需要处理各种类型的数据&#xff0c;C语言处理基本类型还有其他的类型&#xff1a; sizeof关键字 C语言中可以通过sizeof关键字获取某个数据…

Java源码(三)SpringBoot Web容器应用上下文

思维导图 本文主要分析ServletWebServerApplicationContext源码 SpringBoot Web容器应用上下文&#xff08;这是个人的翻译, 如有不足之处还望指出, 大佬勿喷!!!&#xff09; 1.自我思考及复盘 备注&#xff1a; 自我思考及复盘是为了养成带着问题阅读源码及阅读完源码后总结…

echarts 雷达图

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、雷达图二、环形图三…

27 个Python数据科学库实战案例 (附代码)

为了大家能够对人工智能常用的 Python 库有一个初步的了解&#xff0c;以选择能够满足自己需求的库进行学习&#xff0c;对目前较为常见的人工智能库进行简要全面的介绍。 1、Numpy NumPy(Numerical Python)是 Python的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算…

US News退榜风波后,发布最新美国最佳法学院和医学院排名

从2022年11月开始&#xff0c;美国权威排名机构US News不断陷入风波。耶鲁大学法学院率先宣布退出US News法学院排名&#xff0c;先是法学院&#xff0c;后是医学院&#xff0c;包括哈佛大学大学、斯坦福大学、哥伦比亚大学和加州大学伯克利分校等名校也纷纷宣布退出。 这些老…

【C语言】const关键字的作用

文章目录 一. const修饰变量二. const修饰指针三. const修饰函数参数 一. const修饰变量 被 const 修饰的变量具有常属性&#xff0c;这里的常属性指的是变量的值不能被修改 int main() {// const可以写在类型之前&#xff0c;也可以写在类型之后int const a 10;a 20;// er…

【操作系统——内存的基本知识,逻辑地址到物理地址的转换,操作系统对内存空间的分配和回收以及扩充和保护】

文章目录 内存的基本知识什么是内存&#xff1f;内存有什么作用&#xff1f;进程运行的基本原理知识回顾 内存的管理概念内存空间的扩充内存空间的分配与回收连续分配管理方式动态分区的算法&#xff1a; 内存的基本知识 什么是内存&#xff1f;内存有什么作用&#xff1f; 内…

Linux日志分析

日志的分类 内核以及系统日志 内核及系统日志由系统服务 rsyslog 统一管理&#xff0c;主配置文件为/etc/rsyslog.conf&#xff0c;主程序/sbin/rsyslogd Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。 系统日志基于rsyslog服务&#xf…

【LeetCode】剑指 Offer 63. 股票的最大利润 p304 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/ 1. 题目介绍&#xff08;63. 股票的最大利润&#xff09; 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 【测试用…

自然语言处理 —— 02 基于规则的词法分析

一、什么是词法分析? 词:是自然语言中能够独立运用的最小单位,是语言信息处理的基本单位。 词法分析:是词汇层的分析技术。主要包括词的识别、形态分析、词性标注等任务。 1. 词的识别 将句子转换成词序列【就是分词?】 2. 形态分析 词的构成、形态变化、词形还原。 …