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%左右的提升
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • AbstractInterceptor和MethodFilterInterceptor的区别

    AbstractInterceptor和MethodFilterInterceptor的区别1.AbstractInterceptor是Interceptor的子类。2.MethodFilterInterceptor是AbstractInterceptor的子类,你需要实现的拦截器支持方法过滤性,就继承MethodFilterIntercepter这个类.默认的情况下,拦截器会拦截Action中的所有的方法,这里不包括setter或getter方法.这时就可以使用方法

  • fprintf函数的用法_itoa函数

    fprintf函数的用法_itoa函数fprintf()用于文件操作#includeintfprintf(FILE*stream,constchar*format,…);fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.

    2022年10月19日
  • 实用cmd指令(1)

    实用cmd指令(1)

  • python一行实现局域网内传输文件[通俗易懂]

    python一行实现局域网内传输文件[通俗易懂]python一行实现局域网内传输文件熟悉python的大家伙,对于这个应该不陌生,这个功能我一直都在使用,今天想记录一下其实时想抛砖引玉。缘由记得那是刚开始学习python,对任何精简而强大的功能都感到好奇。从任何平台,只要看到关于python的文章,就会点进去进行深度阅读。久而久之,的确学习到了一些小技巧,或言之投机取巧吧。比如,这个用python来实现局域网内文件传输,就是在用了坚果pr…

  • 单幅图像超分辨率重建(图像超分)

    代码的解析已经给出,现在补上:单图像超分辨率重建示例代码解析目录一、简介二、前期准备三、运行程序四、参考目录一、简介图像超分辨率重建技术就是利用一组低质量、低分辨率图像(或运动序列)来产生单幅高质量、高分辨率图像。图像超分辨率重建应用领域及其宽广,在军事,医学,公共安全,计算机视觉等方面都存在着重要的应用前景。在计算机视觉领域,图像超分辨率重建技术有可能使图像实现从检出…

  • 移动端页面适配方案(viewport)[通俗易懂]

    移动端页面适配方案(viewport)[通俗易懂]通过<metaname=”viewport”>给视口设置固定的宽度,浏览器对页面自动缩放来实现页面的适配效果优点是可以使用px布局,不用额外进行rem或者vw等等单位的换算了缺点是如果是无滚动条的页面在某些设备上(例如平板这种宽高3比4的,折叠屏8比7的)由于宽高比不同有些区域会被挤到视口之外从而导致一些体验上的问题,不过demo2也给出了解决方案;这里给两个demo,demo1是有滚动条页面的示例,demo2是无滚动条页面的示例;新建一个html文件将demo复制过去在浏览器.

发表回复

您的电子邮箱地址不会被公开。

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