unordered_map 与map使用说明

news2024/11/19 18:40:21

目录

背景:

问题分析:

使用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是无序,因此对于虚拟通道组35和113 是随机存储,先后顺序不固定,因此哪个通道组存储在另一个通道后,最后输出的报文就时该报文。

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

通过分析,发现Windows和Linux下,unordered_map中key值存储先后顺序不一致.

在Linux下,查看队列存储顺序:

因此,在Linux系统中,实际输出报文内容为113通道数据。(键值转换关系uint32_t id = (i + 1)*10 + channelNumber; i为虚拟通道号,channelNumber为1)

在Windows下,查看队列顺序:

在Windows下,实际输出报文内容为35通道数据,因此,在Windows下,门信号不存在跳变情况。

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

使用同一段代码进行测试,分别验证以上两个问题:

#include <iostream>
#include <unordered_map>
#include <iostream>

int main()
{
    std::unordered_map<uint32_t, uint32_t> map1;
    std::unordered_map<uint32_t, uint32_t> map2;

    for(uint32_t i = 0; i < 10; i++)
    {
        map1[i] = i;
        map2[i] = i;
    }

    std::cout << "map 1 : " <<  std::endl;
    std::unordered_map<uint32_t, uint32_t>::const_iterator iter = map1.begin();
    while (iter != map1.end()) {
        std::cout << " " << iter->first;
        iter++;
    }
    std::cout << std::endl;

    std::cout << "map 2 : " <<  std::endl;
    iter = map2.begin();
    while (iter != map2.end()) {
        std::cout << " " << iter->first;
        iter++;
    }
    std::cout << std::endl;
}

在Linux系统上输出:

在Windows系统上输出:

因此可得:对于unordered_map队列,相同输入情况下,在同一操作系统下,存储key值顺序是一致的,在不同操作系统下,存储的key值顺序是不一致的。

结论:

  • 由于unordered_map队列是无效的,并且在不同操作系统下,内部存储key值顺序是不确定的。
  • 对于不同通道的CAN ID,需要开辟不同存储空间进行存储,当存在相同CAN ID 时避免出现报文覆盖的情况。

容器介绍:

unordered_map:

  • unordered_map是一个无序容器,它基于哈希表(Hash Table)实现。它使用键的哈希值来存储和访问元素,因此在`unordered_map`中插入和查找元素的时间复杂度通常为O(1),具有常数时间复杂度的特点。然而,由于哈希表的实现方式,`unordered_map`的元素顺序是不确定的。

map:

  • map是一个有序容器,它基于红黑树(Red-Black Tree)实现。它以键值对的形式存储数据,并根据键的排序对元素进行排序。这意味着在`map`中插入和查找元素的时间复杂度为O(log n),其中n是容器中的元素数量。由于有序性质,`map`可以高效地进行范围查询和有序遍历。

对于需要存储为有序队列使用map,对于无顺序要求存储,只用unordered_map。由于unordered_map的无效性,对于同样输入顺序,在不同系统上,在内存中存储的顺序是不同的。

性能对比:

100w量级的耗时:

map insert time: 840.515000 ms
map find time: 764.570000 ms
map erase time: 753.324000 ms
unordered_map insert time: 488.741000 ms
unordered_map find time: 228.738000 ms
unordered_map erase time: 255.590000 ms

参考资料:

C++中的unordered_map用法详解-CSDN博客

安全验证 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文本批量高效编辑管理,支持将文本进行自定义行数进行拆分,实现文本的高效管理

在信息爆炸的时代&#xff0c;文本文件的管理和编辑成为了许多工作和学习中不可或缺的一部分。面对大量的文本内容&#xff0c;如何高效地进行编辑和管理成为了一个挑战。现在&#xff0c;我们为您带来了一款强大的批量文本编辑管理工具&#xff0c;支持自定义行数拆分&#xf…

面试题集中营—分布式共识算法

分布式共识算法目标 分布式主要就是为了解决单点故障。一开始只有一个服务节点提供服务&#xff0c;如下图所示。那么如果服务节点挂了&#xff0c;对不起等着吧。 为了服务的高可用性&#xff0c;我们一般都会多引入几个副节点当备份&#xff0c;当服务节点挂了&#xff0c;就…

BRC20铭文铭刻解析

BRC20铭文铭刻的出现对于智能制造无疑是一个重要的里程碑。随着科技的飞速发展&#xff0c;智能制造已经成为制造业发展的必然趋势&#xff01;智能制造是指通过运用人工智能、物联网、大数据等先进技术&#xff0c;实现生产过程的自动化、智能化和高效化。 1. BRC20铭文的概念…

2024常见的自动化测试工具和框架!

在软件测试领域&#xff0c;自动化测试框架有很多&#xff0c;这里主要介绍几种常用的自动化测试框架。 以下是几种常用的自动化测试框架&#xff1a; Selenium&#xff1a;Selenium 是一个功能强大的Web应用程序测试框架&#xff0c;支持多种编程语言&#xff0c;如Java、Pyt…

在ELF 1开发环境中使用Qt Creator进行远程调试

Qt Creator是一款跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要适用于支持Qt框架的各类应用程序开发。其内置的远程调试机制使得开发者能够在本地开发环境中对部署在远程设备上的代码进行调试&#xff0c;无需直接对远程设备进行操作。Qt Creator会通过网络连…

Django中的实时通信:WebSockets与异步视图的结合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中&#xff0c;实时通信已经成为了必不可少的功能之一。无论是在线聊天、…

将图片按灰度转换成字符

from struct import *ch [., :, !, ~, ,, ^, *,$, #]//可以在这里面由浅到深添加字符 ch.reverse()def calc(R, G, B):#模式Lreturn R * 299 // 1000 G * 587 // 1000 B * 144 / 1000def character( val):num val / 260 * len(ch)num round(num)if num>len(ch):numlen(…

【H4012】3.3V5V12V24V30V,3.5A大电流温度低 高效同步降压芯片IC DC-DC

您提到的“3.3V, 5V, 12V, 24V, 30V, 3.5A 高效同步降压芯片IC DC-DC”是指一种能够将较高电压&#xff08;例如24V或30V&#xff09;降至较低电压&#xff08;例如3.3V, 5V或12V&#xff09;的直流-直流&#xff08;DC-DC&#xff09;转换器。这种转换器通常使用同步降压技术&…

uniapp 安卓批量异步权限授权,没有授权就跳系统App设置页

首先需要一个js的sdk&#xff1a;App权限判断和提示 - DCloud 插件市场 下载下来&#xff0c;引入里面的 permission.js 示例代码&#xff1a; <script>import { requestAndroidPermission } from ./sdk/permission.jsexport default {onLaunch(e) {const getMutiPer…

kerberos:适配华为FI

文章目录 一、hive1、hive thrift连接方式 一、hive 1、hive thrift连接方式 kerberos认证失败信息 缺少配置&#xff1a;{“hadoop.rpc.protection”:“privacy”}&#xff0c;具体可参考&#xff1a;kerbros认证相关问题 华为FI参考资料&#xff1a; https://github.com…

从零开始学习Linux(4)----yum和vim

1.Linux软件包管理器yum Linux中我们要进行工具/指令/程序&#xff0c;安装&#xff0c;检查卸载等&#xff0c;需要yum的软件 安装软件的方式&#xff1a; 源代码安装---交叉编译的工具rpm包直接安装yum/apt-get yum是我们Linux预装的一个指令&#xff0c;搜索&#xff0c;下…

如何防止用户手动填写身份证信息来作弊?

当前有不少的网站或企业需要用户采用身份证读卡器远程在程序里面填写身份证信息&#xff0c;用于核实用户的真实身份&#xff0c;以完成某些业务&#xff0c;但是&#xff0c;有些用户为了达到不可告人的目的&#xff0c;会采用作弊手段&#xff0c;绕过机器采集这一关&#xf…

牛客网:环形链表的约瑟夫问题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;每日一练 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f3dd;1.问题描述&#xff1a; 前言&#xff1a; 约瑟夫问题 有很多种解决办法&#xff0c;下面我们用链表进行解题 题目链…

学校管网的仿写

工字形布局完成 效果 代码部分 在这里插入代码片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

AI日报:最强大模型Llama 3发布;Midjourney推社交新功能Room;超强AI视频自动剪辑工具Captions;手机上可以玩大模型了

新鲜AI产品点击了解&#xff1a;https://top.aibase.com/ 1、最强大模型Llama3 正式发布 已达GPT4 级别 Llama3是Meta公司最新发布的开源模型&#xff0c;拥有80亿和700亿参数规模&#xff0c;预计7月正式发布。该模型具备多模态能力&#xff0c;集成了新的计算机编码功能&am…

C++类和对象(中)(2)

一、拷贝构造函数 1.1 拷贝构造函数的概念 在现实生活中我们对于两个一模一样的人我们将他们称之为双胞胎&#xff0c;那么我们在创建对象的时候&#xff0c;能不能创建一个和已经存在的对象一模一样的新对象呢&#xff1f;这种做法是可以的&#xff0c;通过拷贝构造函数我们…

Docker镜像的使用与操作

1、什么是镜像 Docker镜像是用于创建容器的只读模板&#xff0c;它包含文件系统。一个Docker镜像可以包括一个应用程序以及能够运行它的基本操作系统环境。 镜像是创建容器的基础&#xff0c;通过版本管理和联合文件系统&#xff0c;Docker提供了一套十分简单的机制来创建镜像…

二叉检索树的查找删除(替换删除)的实现

1、查找元素 当当前结点元素key小于要查找的元素的key时,该元素一定在当前结点的右子树中&#xff0c;以此递归的进行search()&#xff0c;直到key相等。反之亦然 2、查找最小元素 最小元素一定在根结点的左子树中&#xff08;在左子树递归&#xff09; 基准情形&#xff1…

Llama3本地部署实现模型对话

1. 从github下载目录文件 https://github.com/meta-llama/llama3 使用git下载或者直接从github项目地址下载压缩包文件 git clone https://github.com/meta-llama/llama3.git2.申请模型下载链接 到Meta Llama website填写表格申请,国家貌似得填写外国,组织随便填写即可 3.…

中医方解笔记

目录 大青龙汤小青龙汤金匮肾气丸逍遥丸君臣佐参考《方剂学》 加味逍遥丸&#xff08;丹栀逍遥丸&#xff09;使用情况组成丹栀逍遥丸为什么可以缓解口干&#xff1f; 补中益气丸 大青龙汤 小青龙汤 金匮肾气丸 逍遥丸 君 柴胡。疏肝解郁&#xff0c;使肝郁得以条达。 臣 当…