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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab心形曲线代码_matlab心形

    matlab心形曲线代码_matlab心形(1)有网格线clearx=-2:0.01:2;y=sqrt(2*sqrt(x.^2)-x.^2);z=asin(abs(x)-1)-pi./2;plot(x,y);gridon;holdon;plot(x,z);axisequal;效果图(2)无网格线t=0:0.1:2*pi;x=16*sin(t).^3;y=13*cos(t)-5*cos(2*t)-2*co…

    2022年10月17日
    0
  • 蚂蚁金服 SOFAArk 0.6.0 新特性介绍 | 模块化开发容器

    蚂蚁金服 SOFAArk 0.6.0 新特性介绍 | 模块化开发容器

    2021年7月3日
    136
  • Java Spring 框架详解

    Java Spring 框架详解文章目录1Spring入门1.1Spring简介1.1.1Spring的由来1.1.2Spring的优点1.1.3Spring的体系结构1.2Spring开发环境1.2.1环境准备1.2.2创建Spring工程1.3使用IDEA开发Spring入门程序2SpringIoC2.1SpringIoC的基本概念2.2SpringIoC容器2.2.1BeanFactory2.2.2ApplicationContext3SpringBean4SpringAOP

    2022年7月7日
    20
  • ipfs矿机挖的是什么币(ipfs矿机19年一天收益)

    本文作者:火雷神算,如遇文章内容问题,请立即联系本人删除。感谢您的支持!很多人说,现在的FIL币价如此之低,还需要挖矿吗?火雷神算无法否认,ipf的价值在真正实现之前还有很长的路要走,但是对于ipfs,它只是缺少一个应用程序接口。随着FIL挖矿技术的发展,ipfs将在未来的网络应用道路上走得更快更远!虽然fil的价值下降现在影响到人们对fil矿挖矿预期收益的担忧,但对于那些长期看涨该矿的人来说,这是一个好时机,因为挖矿的成本和门槛也降低了。随着Filecoin网络的不断创新发展、稳..

    2022年4月14日
    58
  • @RequestParam注解详解

    @RequestParam注解详解@RequestParam是传递参数的.@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。publicStringqueryUserName(@RequestParamStringuserName)在url中输入:localhost:8080/**/?userName=zhangsan请求中包含username参数(如/requestparam1?userName=…

    2022年10月28日
    0
  • docker dockerfile详解_docker指令

    docker dockerfile详解_docker指令前言Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile简介Dockerfile是用来构建Docker镜像的构建文件,是由一系列

    2022年8月6日
    3

发表回复

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

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