c++ map有序还是无序_hashmap与map的区别
2023-06-13 09:14:49 时间
大家好,又见面了,我是你们的朋友全栈君。
概述
简单对比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.cn/190390.html原文链接:https://javaforall.cn
相关文章
- c++ 字符串流 sstream(常用于格式转换)
- 深入理解C++11_c++ string char
- 有序的Map集合_map集合特点
- 类外实现成员函数的好处(C++)
- C++算法与数据结构之map
- C++精通之路:map和set的介绍和有关oj题
- c++中constexpr_define和const定义常量的区别
- C++11学习笔记2
- C++结构体和类的区别_c++有结构体吗
- C++字符串加密_c++字符串连接函数
- c++整人死机程序
- C++ 不知树系列之认识二叉树(数组、链表存储的实现)
- 初识C++模板
- C++STL——map与set介绍及使用
- Go语言sync.Map(在并发环境中使用的map)
- C++ map,STL map详解
- C++ 自定义比较函数(map和multimap)详解
- C++ unordered_map及其基本结构和特性
- C++ unordered_map插入元素(insert插入元素)详解
- C++ unordered_map删除元素(erase删除元素)详解
- C++ showpoint操作符(详解版)
- C++ string字符串修改和替换方法详解
- C++ map是什么
- 警惕Redis Map的频繁变更(redis频繁修改map)
- 在Redis中使用Map存储数据(redis里面加入map)
- 学会调整Redis中Map容量的设置(redis设置map大小)
- Redis批量获取多个Map(redis获取多个map)
- C++的头文件和实现文件详解
- C++与C#互调dll的实现步骤