std::map查询效率优化

从C++11到C++23(六)C++20利用contains优化map键值查询的实践与演进 本文探讨了C++20中contains函数如何优化map键值查询,对比传统的find和count方法,详细分析了contains的语法优势、性能提升及实现原理。通过实战案例和性能测试,展示了contains在代码可读性和执行效率上的显著改进,为开发者提供了从旧代码迁移到现代C++的实用指南。 阅读详情

0.现状,数据是个xml文件,每个节点对应的结构体有10个成员变量,共有2000多条数据,用的std::map<string, struct>来保存,用map的find函数进行搜索时的效率极

 

其低下,循环搜索30条数据竟然要20s+,搓死。

 

1.为什么这么慢?

最初怀疑是std::map的效率问题,正考虑是否使用std::hast_map来替换,于是了解下两者之间的差别:

std::map是个自平衡的红黑树,他的效率是平均的

hash_map的是一个hash表,只要你的hash算法足够唯一,你的效率可以达到O(1)

 

翻书时大牛就在旁边,就问了他,把情况和他一说。他立刻点名:

用hash_map的效率确实会比map的高,但你的数据才2000多,两者在这里数量级上的效率差异应该很小。主要的问题应该在于你的map,你的map的value不是一个指针

 

,而是一个大结构体,这会导致搜索时的内存频繁被交换出去,因而导致效率低下。

 

2.按照大牛的建议,修改,测试,消耗的时间由原来的20s+变成了0

 

the end

C++ STL中map与multimap核心差异、应用场景与性能优化全解析 在C++标准模板库中,关联容器是处理键值对数据的重要工具。其底层通常基于红黑树实现,通过自平衡二叉搜索树保证元素的有序性和O(log n)的查找、插入、删除时间复杂度。这类容器的技术价值在于能够高效地建立数据间的映射关系,是实现字典、索引和配置管理等功能的基石。在实际工程中,根据键的唯一性需求,衍生出两种主要容器:std::map强制键的唯一性,适合一对一的映射场景;而std::multimap允许键重复,天然支持一对多关系建模。理解两者的核心差异,特别是multimap如何使用equal_range处理重 阅读详情

相关推荐

【c++】std::map 和 std::unordered_map选用

红黑树的迭代器 效率高 ,时间复杂度 O(logN) 哈希表的查找效率 高, O(1) 红黑树查找和删除的时间复杂度都是O(logn),Hash查找和删除的时间复杂度都是O(1)。 为啥哈希表内存占用高? 内存需要预先分配 用以存储散列表 红黑树 std::map对应的数据结构是红黑树。 红黑树是一种近似于平衡的二叉查找树,里面的数据是有序的。 在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。 哈希表 而std::unordered_map对应哈希表,哈希表的特点就是查..

突围 2042

std::map find和count效率测试

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

十雨五风的博客 8719

聚焦112Gb/s SerDes芯片的AN/LT端口自协商和链路学习,评估验证高速链路的信号质量并分析调优(400/800G高速以太网互联接口,AI加速卡网络RDMA性能测试,交换背板接口性能评估)

在112G SerDes高速通道下的400G/800G高速以太网端口下,如何保障通信速率,验证SerDes的数据完整性和链路余量,自动协商(AN)和链路训练(LT)功能显得尤其重要,其在DAC、ACC、AEC铜缆连接或高速背板通信上,自动协商(AN)和链路训练(LT)的工作与否将决定高速链路传输质量的优劣。本文将系统的讨论介绍自动协商(AN)和链路训练(LT)的测试流程,其可以独立使用,也可以与teledynelecroy SierraNet M1288配合使用。

专注有线以太网性能测试--丹麦信雅纳网络(Xena Networks) 9404

面试中常问的STL

1Vector 1.1 底层是如何实现的 在堆中或栈中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放.如果新值>当前大小时才会再分配内存.当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。扩容一般是扩大1.5倍或者2倍,vs中扩容的是1.5倍。内部使用allocator类进行内存管理,程序员不需要自己操作内存。对 vector 的任何操作,一旦引起空间重新配置,指向原 vector 的所有迭代器就都失效了。 vector就是一个动态数组,里面有一个指针指向一

kvsp24的博客 570

FPGA AXI DDR3读写时序调试与FIFO缓存实战解析

本文深入解析FPGA中AXI协议与DDR3的读写时序调试,重点探讨FIFO缓存在数据流控制中的关键作用。通过实战案例详细讲解突发传输中的地址对齐、数据分片等常见问题,并提供状态机设计、仿真波形分析和性能优化技巧,帮助开发者高效解决高速数据存储场景下的时序同步与数据一致性问题。

blockchain9miner的博客 1119

MuJoCo 动捕接口 Mocap 直接操控机械臂(附代码)

动作捕捉(Motion Capture,简称 Mocap)是一种记录并处理人或物体动作的技术,在影视、游戏、机器人等领域应用广泛。通过上下左右以及alt_l,alt_r可以控制hand这个hody跟着mocap进行同步,这里将quat固定为Z朝下。首先在 scene.xml 中修改添加 mocap 和 equality。下面介绍如何配置 Mocap 以及使用按键进行末端控制。控制核心代码,通过按键控制mocap的pos和quat。

darcsdn 879

stl中 map ,unordered_map . hash_map插入,查询,对比测试结果

map: map内部实现了一个红黑树 所有元素都是有序的。 hash_map: unordered_map: 内部实现了一个哈希表 其元素的排列顺序是无序的。 std::map 所有元素都是有序(红黑树) tr1::unordered_map元素的排列顺序是无序的(哈希表) 测试一:O1编译 插入10000000次 map类型 插入int 插入std::string 全部查找int 全部查找std::string std::map 10.8376 sec 21.5493 sec 5.74504 sec 15

songsiwen2012的博客 966

3D视觉-激光三角测量法的概述和原理

激光三角法位移测量的原理是,用一束激光以某一角度聚焦在被测物体表面,然后从另一角度对物体表面上的激光光斑进行成像,物体表面激光照射点的位置高度不同,所接受散射或反射光线的角度也不同,用。激光三角测量法是一种通过图像采集系统采集被测物表面漫反射的激光轮廓,进而基于设备已知的相对位置通过算法处理,获得被测物表面的三维轮廓数据,进而还原目标物体三维空间信息的方法。采用激光三角原理和回波分析原理进行非接触位置、位移测量的精密传感器, 广泛应用于位置、位移 、厚度、半径、形状、振动、距离等几何量的工业测量。

qq_20660115的博客 3921

C++ std map unordered_map hash_map 的查找性能测试代码及结果

测试结果 Release模式下: 查找效率:unordered_map ≈ hash_map > map std::map 的效率远小于 unordered_map 和 hash_map Debug模式下: 1. 查找效率:hash_map > unordered_map > map 2. 随着容量的增加,hash_map, unordered_map的查找效率有所降低,但浮动不大毕竟是常量级别。map的效率直线下降.... 详细数据见本文下方的 [测试过程记录](测试过程记录)

Echo的博客 2223

windows使用jupyter notebook读取文件路径的几种方法和设置默认打开路径

简单分享小虎这段时间以来学到的jupyter notebook操作技巧。

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 1万+

PyTorch深度学习实战(2)——PyTorch基础

PyTorch 是广泛应用于机器学习领域中的强大开源框架,因其易用性和高效性备受青睐。在本节中,将介绍使用 PyTorch 构建神经网络的基础知识。首先了解 PyTorch 的核心数据类型——张量对象。然后,我们将深入研究用于张量对象的各种操作。PyTorch 提供了许多帮助构建神经网络的高级方法及组件,并提供了利用 GPU 更快地训练神经网络的张量对象。

盼小辉丶的博客 5万+

【C++】第十一篇(基础)STL map创建、遍历、插入、删除等(详解)

1、map类型介绍 map是STL关联类型的一种,它以<key,value>一对一的形式存储,且map的内部自建一个红黑树,使得其可以自动排序. key可以时任意的数据类型,比如int,char,包括用户自定义数据类型。 value是该key对应的存储的值。 2、用法 使用的时候需要加入头文件: #include <map> //头文件定义 2.1 定义 std::map<key_type,value_type>变量; 例如: std::ma

Fanjufei的博客 2105

大学计算 - 方程求解 实训答案 第3关

【代码】大学计算 - 方程求解 实训答案 第3关。

2403_89314916的博客 107

一些map优化的办法

std::map用于key-value式的查询,增加map的效率的办法: 1. 使用emplace代替insert. 直接构建key-value对象 map.emplace(std::piecewise_construct, std::forward_as_tuple(i,"x"), std::forward_as_tuple(i)); 2. ...

audi2的专栏 1863

Python爬虫逆向案例:某云片滑块验证码分析-滑动验证码

今天我们看个滑块。

2201_76125393的博客 1034

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SET、MAP底层原理

在STL中,虽然不同的底层实现的数据结构相同,但是分清不同的底层实现,了解其异同,根据不同的应用场景选择不同的底层实现,对提高程序的性能,减少不必要的计算大有用处。

qq_44733706的博客 1926

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

AI如何帮你高效使用std::map优化C++代码

然而,即使是这样一个成熟的数据结构,在实际使用中仍然会遇到各种细节问题,比如内存管理、性能优化和错误处理等。总结来看,AI辅助开发并非替代程序员,而是通过自动化模板代码、实时错误检查和性能优化建议,让我们更专注于业务逻辑。输入需求后,AI不仅生成完整代码,还会解释每部分的设计意图,比如为什么选择。对于需要持续运行的服务,平台的一键部署功能更是省去了环境配置的麻烦。这类基础容器的使用上,AI能快速提供符合最佳实践的方案,让C++开发既高效又可靠。),并生成插入数据的代码片段,确保类型安全和初始化规范。

CrystalwaveStag的博客 829

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【C++】通讯录管理系统实战(哈希表优化查询 + 联系人分组)

本文基于C++98标准实现了一个高效的通讯录管理系统,采用「数组存储+哈希表索引」的设计架构。核心存储使用std::vector保存联系人完整数据,同时通过std::map建立姓名和分组的哈希索引,将精准查询时间复杂度优化至O(logN)。系统支持添加联系人、精准查询、模糊查询、分组查询和批量导出五大功能,其中精准查询和分组查询通过哈希索引实现高效访问,模糊查询则通过字符串匹配完成。文章详细展示了各功能的实现代码,包括数据结构的定义、哈希索引的构建以及文件导出等操作,为C++98环境下的高效数据管理提供了实

gfdhy的博客 1610

hash_strmap 为什么那么快

测试结果(普通PC,CPU 3G HZ,内存 2G) 单核达到了每秒 30,000,000 次查询,string 长度是 32 字节,这个速度比 unordered_map 快 10 倍,比 std::map 快 40 倍。iteration 的速度, 比 std::

whinah的专栏 4096

数据结构-5 哈希表

集合 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率 std::set 红黑树 有序 否 否 O(logn) O(logn) std::multiset 红黑树 有序 是 否 O(logn) O(logn) std::unordered_set 哈希表 无序 否 否 O(1) O(1) 映射 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率 std::map 红黑树 key有序 key不可重复 key不可修改 O(lo...

Prince_H_23的博客 240

【std::map】与std::unordered_map差异

本文对比了C++ STL中的map和unordered_map两种关联容器。map基于红黑树实现,保持键有序,性能稳定;unordered_map基于哈希表实现,无序但平均性能更优。

优快云_RTKLIB的博客 688

一文搞懂 C++ 中 std::set、std::unordered_set、std::map 和 std::unordered_map 的用法与选择策略

在C++编程中,std::set、std::unordered_set、std::map和std::unordered_map是常用的关联容器,用于存储唯一键值。std::set和std::map基于红黑树实现,元素自动排序,适合需要有序存储和范围查询的场景,时间复杂度为O(log n)。std::unordered_set和std::unordered_map基于哈希表实现,元素无序存储,适合需要快速查找、插入和删除的场景,平均时间复杂度为O(1),最坏情况下为O(n)。选择容器时需考虑是否需要排序、范围

小庞的博客 1302

std::map vs unordered_map:性能对比与选择指南

std::map和std::unordered_map是两种常用的关联容器,它们各有特点,适用于不同场景。std::map基于红黑树实现,元素按键值自动排序,插入和查询的时间复杂度为O(log n)。而std::unordered_map基于哈希表实现,元素无序存储,平均情况下插入和查询的时间复杂度为O(1)。切换到unordered_map后,查询速度提升了3倍多,完美解决了性能瓶颈。测试显示,在存储100万个元素时,unordered_map的内存占用量比map高出约15-20%。

GoldenleafRaven13的博客 578
上一篇: WM_EXITSIZEMOVE 保存窗口位置的合适时机
下一篇: 推荐:Shell中关于文件路径操作的API函数
debehe
博客等级 码龄22年 38粉丝 67原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值