unordered_map 与map使用说明

博客围绕C++开发中CAN信号解析问题展开。在Ubuntu系统中门信号状态跳变,而Windows系统正常。经分析,是因unordered_map无序且不同系统存储key值顺序不同,导致相同CAN ID数据覆盖。还介绍了unordered_map和map的特点及性能对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

背景:

问题分析:

使用APE工具,查看录制的原始门信号是否存在异常

查看报文读取是否存在问题

分析报文读取代码

为什么在Windows系统中,解析后的门信号没有存在跳变情况

是否Windows 和Linux下 unordered_map中数据先后位置不一致

验证在相同输入下,在不同操作系统下,存储到队列中数据是否一致,在相同系统下,队列中数据存储是否一致

结论:

容器介绍:

unordered_map:

map:

性能对比:

100w量级的耗时:

参考资料:



背景:

最近在开发一个从文件中解析CAN信号功能时,在Ubuntu系统中发现门信号的状态存在跳变情况,而在Windows系统中,门信号的状态正常。

问题分析:

  • 使用APE工具,查看录制的原始门信号是否存在异常

有图可知,原始信号正常,而解析的门信号存在跳变。

  • 查看报文读取是否存在问题

通过分析,发现从文件中解析出来的can报文就存在跳变情况。

  • 分析报文读取代码

通过分析,发现在两个虚拟通道组中,存在相同的CAN 报文ID ,虚拟通道组分别为35和113。其中35通道组为CAN1通道为DBC文件中报文数据,而113通道组为CAN2通道,不在DBC文件中。

在进行CAN报文解析时,首先是按照虚拟通道组逐个进行解析,并且按照虚拟通道号为key值进行存储到unordered_map中。

在所有虚拟通道组解析完后,将CAN报文数据存储到以CAN ID为key值的unordered_map中。

当存在相同的CAN ID时,就会存在CAN 数据被覆盖的情况。

因此,是由于存在相同CAN ID,导致解析后报文数据别另一个CAN报文内容覆盖的情况,导致信号存在跳变。

  • 为什么在Windows系统中,解析后的门信号没有存在跳变情况

通过分析,CAN报文从虚拟通道组解析后,存储到unordered_map中,由于unordered_map是无序,因此对于虚拟通道组3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值