c++ map有序还是无序_hashmap与map的区别

c++ map有序还是无序_hashmap与map的区别概述简单对比map和unordered_map的性能。map内部是红黑树,在插入元素时会自动排序,而无序容器unordered_map内部是散列表,通过哈希而不是排序来快速操作元素,使得效率更高。当你不需要排序时选择unordered_map的效率更高。测试范例测试代码#include<iostream>#include<string>#in…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

概述

简单对比map和unordered_map的性能。
map内部是红黑树,在插入元素时会自动排序,而无序容器unordered_map内部是散列表,通过哈希而不是排序来快速操作元素,使得效率更高。当你不需要排序时选择unordered_map的效率更高。

测试范例

测试代码

#include <iostream>
#include <string>
#include <sys/time.h>
#include <map>
#include <unordered_map>
using namespace std;

const int kRunTime1 = 1000*1000;     // 循环次数
const int kRunTime2 = 1000*10000;
int main()
{
    std::map<int, int> mp;
    std::unordered_map<int, int> unordermp;

    timeval st, et;

    cout << "插入个数 = " << kRunTime1 << endl;
    gettimeofday(&st, NULL);
    for(int i = 0; i < kRunTime1; ++i)
    {
        mp.insert(make_pair(i, i));
    }
    gettimeofday(&et, NULL);
    cout << "1 有序map测试时间insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;

    gettimeofday(&st, NULL);
    for(int i = 0; i < kRunTime1; ++i)
    {
        unordermp.insert(make_pair(i, i));
    }
    gettimeofday(&et, NULL);
    cout << "1 无序map测试时间insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;

    cout << "\n插入个数 = " << kRunTime2 << endl;
    mp.clear();
    gettimeofday(&st, NULL);
    for(int i = 0; i < kRunTime2; ++i)
    {
        mp.insert(make_pair(i, i));
    }
    gettimeofday(&et, NULL);
    cout << "2 有序map测试时间insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;

    mp.clear();
    gettimeofday(&st, NULL);
    for(int i = 0; i < kRunTime2; ++i)
    {
        mp.emplace(make_pair(i, i));
    }
    gettimeofday(&et, NULL);
    cout << "2 有序map测试时间emplace time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;

    unordermp.clear();
    gettimeofday(&st, NULL);
    for(int i = 0; i < kRunTime2; ++i)
    {
        unordermp.insert(make_pair(i, i));
    }
    gettimeofday(&et, NULL);
    cout << "2 无序map测试时间insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;

    unordermp.clear();
    gettimeofday(&st, NULL);
    for(int i = 0; i < kRunTime2; ++i)
    {
        unordermp.emplace(make_pair(i, i));
    }
    gettimeofday(&et, NULL);
    cout << "2 无序map测试时间emplace time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;

    return 0;
}

测试结果

第一次运行

插入个数 = 1000000
1 有序map测试时间insert time:922ms
1 无序map测试时间insert time:360ms

插入个数 = 10000000
2 有序map测试时间insert  time:10451ms
2 有序map测试时间emplace time:10531ms
2 无序map测试时间insert  time:3854ms
2 无序map测试时间emplace time:2956ms

第二次运行

插入个数 = 1000000
1 有序map测试时间insert time:918ms
1 无序map测试时间insert time:344ms

插入个数 = 10000000
2 有序map测试时间insert  time:10470ms
2 有序map测试时间emplace time:10597ms
2 无序map测试时间insert  time:3826ms
2 无序map测试时间emplace time:2932ms

第三次运行

插入个数 = 1000000
1 有序map测试时间insert time:909ms
1 无序map测试时间insert time:376ms

插入个数 = 10000000
2 有序map测试时间insert  time:10395ms
2 有序map测试时间emplace time:10505ms
2 无序map测试时间insert  time:4015ms
2 无序map测试时间emplace time:3102ms

测试结果

  • unordered_map的插入速度明显优于map
  • 对于map,emplace的接口相对于insert 没有提升,甚至效率还差一点
  • 对于unordered_map,emplace的接口相对于insert 有30%左右的提升
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190390.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript高级程序设计(第3版)中文在线阅读,也可以免费下载~

    JavaScript高级程序设计(第3版)中文在线阅读,也可以免费下载~在线阅读地址:http://www.chinastor.org/upload/2014-12/14122310427265.pdf百度网盘:https://pan.baidu.com/s/1hsZUXzm密码:nlul

    2022年8月20日
    6
  • jQuery支持mobile的全屏水平横向翻页效果

    jQuery支持mobile的全屏水平横向翻页效果

    2022年2月2日
    39
  • IOS-导航路线_iphone导航

    IOS-导航路线_iphone导航1.可以将需要导航的位置丢给系统自带的APP进行导航2.发送网络请求到公司服务器获取导航数据,然后自己手动绘制导航3.利用三方SDK实现导航(百度)>当点击开始导航时获取用户输入的起点和

    2022年8月4日
    9
  • Linux CentOS 7安装Oracle11g超完美教程[通俗易懂]

    Linux CentOS 7安装Oracle11g超完美教程[通俗易懂]Oracle部署文章目录Oracle部署1基本环境介绍2检测是否安装了Oracle3卸载Oracle3.1重新做一次虚拟机3.2卸载Oracle4安装准备4.1建立oracle用户和用户组4.2为Oracle的安装创建相关目录4.3优化OS内核参数4.4限制oracle用户的shell权限4.5为Oracle用户添加Oracle环境变量4.6配置hostname(本机IP映射)4.7安装VNC&Oracle相关依赖4.7.1配置yum源4.7.2安装依赖4.7.3检

    2022年7月15日
    19
  • nv12转yuv420_百转

    nv12转yuv420_百转YU12格式也叫I420格式,是YUV420p其中的一种,NV12是YUV420sp的一种。YU12和NV21中YUV数据的排列方式为:YU12:YYYYYYYYUUVVNV12:YYYYYYYYUVUV针对数据排列顺序结构,本文将NV12转为YU12。主要转换接口实现为:intNV12toYU12(char*data,char*out,intwidth,intheight);具体代码如下:/************************************

    2022年9月24日
    4
  • 菜鸟教程java_JAVA笔记(菜鸟教程)[通俗易懂]

    菜鸟教程java_JAVA笔记(菜鸟教程)[通俗易懂]1.局部变量是在栈上分配的。2.局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。3.类变量(静态变量)和实例变量区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象。4.访问控制范围访问控制.jpg(1)private类内访问(2)被声明为protected的变量、方法和构造…

    2022年6月6日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号