c++ 用 vector 替代map

std::map看来可以被淘汰了?可以用vector来替代,而且更好 vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。 阅读详情

当数据的key数量线性可控,且有一个不重复的hash 算法来定义key。尝试用vector来替代map 测试下性能

 

#include <sys/time.h>
#include <iostream>

#include <map>
#include <vector>

int main()
{
  // std::map<int, int> test;
  std::vector<int> test(100, 0); 
  for(int i = 0;i < 100; i++) {
        test[i] = i;
  }
  struct timeval tv; 
  gettimeofday(&tv, NULL);
  int i = 0;
  long c = 0;
  while(i++ < 1000000) {
    c+=test[i % 100];
  }
  struct timeval tv2;
  gettimeofday(&tv2, NULL);
  long s = (tv2.tv_sec * 1000000 + tv2.tv_usec) - (tv.tv_sec * 1000000 + tv.tv_usec);
  std::cout << "total spend " << s << " us\n";
}

测试得知用map时 耗时约177317us

测试得知用vector时 耗时约 4423us

性能提升40倍

C++中vector与map的核心区别与最佳实践 在C++编程中,容器选择直接影响程序性能与内存效率。vector作为动态数组提供连续内存存储,支持O(1)随机访问,特别适合需要频繁读取和尾部操作的场景。而基于红黑树的map则实现了有序键值存储,提供O(log n)的查找效率,是处理映射关系的理想选择。理解两者的内存布局差异(连续vs节点式)和迭代器失效规则对开发稳定应用至关重要。在实际工程中,根据数据规模选择合适容器能显著提升性能,如大数据集下unordered_map的哈希实现通常优于map。掌握这些核心容器的特性,能帮助开发者在序列处理、缓存优化等场 阅读详情

相关推荐

C++容器性能优化:Vector与Map的深度对比与实战技巧

在C++编程中,容器是组织和管理数据的核心工具,其性能直接影响程序的整体效率。容器的工作原理基于不同的数据结构实现,例如连续内存布局和树形关联结构,这决定了它们在内存访问、数据增删和查找操作上的根本差异。从技术价值角度看,深入理解容器的底层机制,能够帮助开发者编写出缓存友好、内存高效的高性能代码,这对于大型软件系统和实时应用至关重要。在实际应用场景中,序列容器如std::vector凭借其连续存储特性,在需要频繁遍历和随机访问时表现卓越;而关联容器如std::map则通过红黑树实现有序键值映射,适用于需要快

weixin_30947043的博客 351

C++—vector与unordered_map

1.vector 1.1说明 vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 进行vector操作前应添加头文件#include <vector> 1.2初始化 1.vector<int>a(10); //定义具...

PayYingJAY的博客 3570

C++最经典的三大容器Vector、Map、List

C++中的容器可以分为好多种,常见的有顺序容器:向量(vector)、双端队列(deque)、列表(list)。还有关联容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。容器有太多,下面就来讲讲用得到也最常用的三种容器vector、list、map。 第一种:Vector容器 示意图: 特点: 地址不变,内存空间连续,所以在中间进行插入和删除时会造成内存块拷贝,如果插入的是结构体或者类,则会造成构造和析构,性能不是特别高,对结尾元素操作最快。 下

qq_44943840的博客 9293

在C++中使用map来取代很多个if else和switch

map居然可以取代很多个if else和switch判断????

qq_41655797的博客 2736

从零开始:用这些公开数据集搞定电力AI项目(含鸟巢、绝缘子、负荷预测等33个实战资源)

本文系统梳理了电力AI领域33个精选公开数据集,涵盖目标检测、负荷预测等关键场景,如鸟巢检测、绝缘子缺陷识别等。通过实战案例解析数据预处理、模型选型及性能优化策略,帮助工程师快速构建端到端解决方案,解决电力AI项目中的数据获取与处理难题。

weixin_42522552的博客 216

双有源桥变换器(DAB)TPS控制:从理论建模到Simulink/PSIM仿真实践

本文深入探讨了双有源桥变换器(DAB)的三重移相(TPS)控制技术,从理论建模到仿真实现。文章详细分析了TPS相比SPS和DPS的优势,阐述了其12种工况的划分逻辑与电流应力最优调制策略,并提供了在Simulink和PSIM平台搭建仿真模型的详细步骤与实战经验,帮助工程师掌握这一高效控制方法。

white的博客 584

c++ 中 map集合的基本使用方法 添加、删除、修改、清空、遍历

c++ 中 map集合的基本使用方法 添加、删除、修改、清空、遍历,在C++语言中,我们经常使用到map集合来存储 key-value 类型的数据。这里将常用到的map集合操作方法整理出来。

qq_43838261的博客 7332

FreeSwitch采用mrcp协议对接科大讯飞asr和tts以及对话系统

FreeSwitch采用mrcp协议对接科大讯飞asr和tts对接过程

shanghaimoon的专栏 8839

map查找并修改元素

#include<bits/stdc++.h> using namespace std; void show(map<int,string>& mp) { map<int,string>::iterator iter=mp.begin(); while(iter!=mp.end()) { cout<<iter->first<<" "<<iter->second<<e...

wsfcc的专栏 1675

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 260

从零开始理解固定翼能量控制:Pixhawk TECS算法保姆级教程

本文深入解析了Pixhawk飞控中的TECS(总能量控制)算法,旨在解决固定翼无人机纵向控制中速度与高度耦合的经典难题。教程从物理概念出发,阐释了TECS通过管理总能量与分配能量形态来实现油门与升降舵解耦的核心思想,并提供了参数调试的实战指南,帮助开发者优化飞行性能。

white的博客 249

C++ 练习9

【代码】C++ 练习9。

波风水门的博客 295

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 493

[cpp32 note] 5. 容器2

cpp17后提供了std::size()方法,可以获取c数组的长度。并且在数组退化时使用会编译报错。array保留了c数组在栈上分配的特点,还提供了begin、end、size等通用成员函数。作为参数时有退化行为,传递后函数内部无法获得c数组长度和结束位置。c数组没有良好的复制行为,无法作为map之类容器的key。array还支持作为map的key。没有size成员函数。

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 148

OFDR解调全同弱反射光纤阵列

全同弱反射光纤光栅阵列是在一根光纤上密集刻写波长相同的WFBG,由于每个光栅的反射都比较弱,可实现一根光纤上复用成千上万个光栅,阵列上每个光栅栅区长度相同,相邻光栅之间栅距相同,呈周期性分布。2、获取测量信号:对弱栅阵列加载状态下,使用OFDR系统再次获取弱栅时域曲线,为测量信号。(这里需要注意的是对弱栅阵列加载后,不能使弱栅中心波长漂移到激光器波长扫描范围之外,若超出范围则OFDR技术不能获取弱栅反射信号,因此在选择弱栅阵列波长时尽量让其中心波长在激光器波长扫描范围中间,确保温度/应变测量范围。

m0_69386663的博客 1954

1、网站可靠性工程(SRE):原理、实践与转型指南

本文深入探讨了网站可靠性工程(SRE)的核心原理、实践方法以及组织转型策略。从SRE的基本概念如服务水平指标(SLI)、服务水平目标(SLO)和错误预算入手,详细解析了如何通过SRE实现产品开发、运营和管理团队的高效协作。此外,还涵盖了SRE的实施步骤,包括现状评估、组织认同、基础设施建设、事件响应、错误预算政策制定以及组织结构设计等内容。最后,文章展望了SRE的未来发展,强调了服务目录、合规监管及SRE文化建设的重要性,为企业的现代化运营体系转型提供了全面指南。

xk7n92h3p5m的博客 145

map的一种替代方案,不会自动排序

map的一种替代方案,不会自动排序

tangaowen的专栏 5691

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ -STL之map、vector、set

STL之map、vector、set C++的标准模板库(Standard Template Libray,简称STL)是一个容器和算法的类库。容器往往包含同一类型的数据。STL中比较常用的容器是:vector、set和map,比较常用的算法有Sort等。 一、vector(数组的代替品) 1.声明: 一个vector类似于一个动态数组。 vector中可以存在重复的元素! vector<i...

一直努力 649

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

廖雪峰Python教程[完整版]

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

vector,map 注意事项

1.关于vector的越界访问:std::vector<int> list; for (int i = 0; i < 5; i++) { list.push_back(i); } for (int i = 0; i < 6; i++) { std::cout << list[i]; } 首先以上的代码可以正确编译通过并运行的,不过list[5]是0,在vector中,如果通过[i]下标访问元

566

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

全部没有整理,(先收集)待理解   一、vector vector采用一段连续的内存来存储其元素,向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入。vector的元素插入性能跟以下几个要素关系重大: 1. 插入的位置 头部插入:将所有元素后移,然后将新元素插入

D_R的博客 764

从‘清点代码库’到实际项目:聊聊C++ STL中map的键用vector这件事

本文深度解析了C++ STL中vector作为map键的设计哲学与实际应用。从竞赛技巧到工程实践,探讨了vector作为键的底层逻辑、典型应用场景及性能优化策略,帮助开发者更好地理解和使用STL容器嵌套技术。

weixin_42522167的博客 350

C++中vector可以作为map的键值实例代码

先澄清题面:这里的"键值"指的是键(key),即这种把放在第一个模板参数的位置。同时说明,vector作为value当然也可以,那是另一回事,本文主要讲它作为键。std::map的第三个模板参数是比较器,默认是,要求Key支持。恰好提供了按字典序比较的operator<,所以可以直接编译,不需要写任何自定义比较器。这一点经常被误解为"必须自己写比较函数",其实不必。但"能编译"不等于"适合"。用vector作键有几个必须知道的语义:比较是逐元素的字典序,长度参与比较;每次插入都会复制整个vector;

2601_96221861的博客 53

map的一种替代方案,不会自动排序(转)

map的一种替代方案,不会自动排序    看来只有用vector   >了    ...     #include       #include       #include      

jkjkjkjk的专栏 1183

C++中 使用数组作为map容器VAlue值的解决方法

1)是用Vector容器代替数组 2)使用数组指针(需要注意局部变量的问题,指针是否需要用new创建) int red [ 3 ]   = { 1 , 0 , 0 }; int green [ 3 ] = { 0 , 1 , 0 }; int blue [ 3 ]     = { 0 , 0 , 1 }; std :: map &lt; int , int (*)[ 3 ]&gt; colours...

weixin_34102807的博客 1013

C++标准库容器性能调优全攻略(从vector到unordered_map的极致优化)

掌握C++标准库STL容器性能优化技巧,系统提升程序效率。涵盖vector、list、map到unordered_map的适用场景与调优策略,如内存预分配、选择合适容器、减少重哈希等核心方法。显著降低时间与空间开销,适用于高频数据处理与高性能计算场景,值得收藏。

ProceNest的博客 934
上一篇: awk 字符串转时间戳
下一篇: 高性能c++ string split实现
Sweet_Oranges
博客等级 码龄12年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值