STL Map的使用和性能issue

1、高效地访问

1)隐式插入问题
map初学者会直接用中括号访问,方便但是有代价:key不存在的时候还会隐式插入,

尤其对于LRU缓存设计,用这个就是灾难,会导致脏数据,
规避方案,cache的visit函数采用const修饰,同时采用下面的方案访问,

2)多遍历一次的性能问题

Value LRUCache::Get(const KeyType& key, ValueType& value) {if (map_.count(key) > 0) {return map_[key];return ValueType();
}Value LRUCache::Get(const KeyType& key, ValueType& value) {if (map_.find(key) != map_.end()) {return map_[key];return ValueType();
}

使用迭代器更高效,当map非常大的时候,差异更显著

Value LRUCache::Get(const KeyType& key, ValueType& value) const {auto iter = map_.find(key);return iter == map_.end() ? ValueType() : iter->second;
}

2、insert失败的情况

insert返回是一个pair,支持两种类型。在实际工程项目中,很少见c++代码中处理insert失败的情况,

最近居然踩了一个坑,车道级渲染合批以后,没有道路了,

  • 深入分析结果是查找失败,但是insert也失败了。
  • 合批merge的时候,一种特别的case,导致了丢包的操作,mesh丢了,结果非常恶劣。。

key compare的问题,整个map不再是排序树了,示例代码如下,

comparator 的两种写法

// 写法1
bool MergedMateriallKey::operator<(const MergedMateriallKey &o) const
{return color1 < o.color1 || color2 < o.color2 || tex < o.tex || mix_tex < o.mix_tex;
}
// 写法2
bool MergedMateriallKey::operator<(const MergedMateriallKey &o) const
{if (color1 != o.color1)return color1 < o.color1;if (color2 != o.color2)return color2 < o.color2;if (tex != o.tex)return tex < o.tex;return mix_tex < o.mix_tex;
}

主要差别点:

  • 写法1,分支太多,不是严格的排序树,
  • 写法2,只要color1不等就直接用他排序,用color2比较的唯一前提是color1相等了,

代码鲁棒的建议

key越少越好,2个int转化成一个long long,
字符串用hash值,或者转化成指针比较,
实在没招就diy结构体,key越少越好。

题外话

stl map的insert失败是静默的,返回值很容易被无效,
不像C#那么猛烈,如果key重复了直接抛异常exception,如果你不处理就直接crash,

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

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

相关文章

如何在调整节拍时间的过程中保持生产流程的稳定性?

在快节奏的工业生产领域&#xff0c;节拍时间&#xff08;Takt Time&#xff09;——即完成一个完整产品所需的标准时间&#xff0c;是维持生产效率和流程稳定性的关键指标。然而&#xff0c;市场需求的波动、技术升级或是生产线的微调&#xff0c;都可能要求我们对节拍时间进行…

Redis-主从模式

目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制&#xff08;Full Sync Replication&#xff09; 局部复制&#xff08;Partial Replication&#xff09; Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 前言 …

SLAM:corners:Measuring Corner Properties-1999【方法解析-1】

paper:Measuring Corner Properties 目录 摘要1. 引言2. 测量属性2.1 对比度和夹角详细解析摘要 我们描述了测量灰度角点以下属性的方法:夹角、方向、对比度、钝度(或顶点的圆度)以及边界曲率(适用于尖点)。与大多数已发表的提取这些属性的方法不同,这些新方法相对简单…

docker安装phpMyAdmin

直接安装phpMyAdmin需要有php环境&#xff0c;比较麻烦&#xff0c;总结了使用docker安装方法&#xff0c;并提供docker镜像。 1.docker镜像 见我上传的docker镜像&#xff1a;https://download.csdn.net/download/taotao_guiwang/89595177 2.安装 1).加载镜像 docker load …

NodePort:固定端口

NodePort:固定端口 ## ************************************************** # 测试固定端口 # ## ************************************************* apiVersion: apps/v1 kind: Deployment metadata:name: kevin-fixed-portnamespace: default spec:# 副本数量#replicas: …

AC/DC和DC/DC开关电源的传导和辐射原理

电磁干扰&#xff08;EMI&#xff09;始终是开关电源&#xff08;AC/DC和DC/DC转换器&#xff09;的潜在问题。如今的电源有很好的电磁发射和抗干扰的能力。但为了满足特定的应用要求&#xff0c;仍要有正确的滤波电路以确保满足标准的要求。 基于AC/DC和DC/DC电源模块的很佳EM…

CentOS7使用yum安装MySQL

废话不多说&#xff0c;直接上干货 1、CentOS7的yum源中默认是没有mysql的&#xff0c;我们先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2、安装mysql-community-release-el7-5.noarch.rpm包 sudo rpm -ivh mysql-community-r…

AI大模型Prompt提示词工程使用详解

AI大模型Prompt提示词工程使用详解 在人工智能&#xff08;AI&#xff09;的浩瀚宇宙中&#xff0c;大型预训练模型&#xff08;Large Language Models, LLMs&#xff09;如GPT系列、BERT等&#xff0c;以其卓越的自然语言处理&#xff08;NLP&#xff09;能力&#xff0c;正逐…

策略模式面试三道题

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。在面试中&#xff0c;关于策略模式的题目可以从基本概…

javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密

deriveKey 方法的完整示例&#xff0c;演示如何使用 HMAC 作为密钥派生函数&#xff08;KDF&#xff09;来从一个给定的秘密&#xff08;如密码&#xff09;派生出一个新的 AES 加密密钥。 //创建一个函数来生成随机盐function getRandomSalt(length){let arraynew Uint8Array…

商城购物系统

下载在最后 技术栈: ssmmysqljsp 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

React基础教程:选项卡案例

文章目录 6.1 初始化选项卡6.2 数据请求+模糊搜索6.1 初始化选项卡 新建12-卖座位选项卡.js文件 通过判断当前的索引,来绑定className属性,进行选项卡激活的显示,如果当前的索引等于index,那么就绑定属性active className={this.state.current === index ? active : }i…

Hbase简介和快速入门

一 Hbase简介 1 HBase定义 Apache HBase™ 是以hdfs为数据存储的&#xff0c;一种分布式、可扩展的NoSQL数据库。 2 HBase数据模型 HBase的设计理念依据Google的BigTable论文&#xff0c;论文中对于数据模型的首句介绍。Bigtable 是一个稀疏的、分布式的、持久的多维排序map…

Idea常用快捷键:设置自动导包

Idea设置自动导包 【File】→【Setting】(或使用快捷键【Crlt Shift S】)打开Setting设置。点击【Editor】→【General】→【Auto Import】。勾选自定导包的选项&#xff0c;并确定&#xff0c;如下&#xff1a; Addunambiguousimportsonthefly&#xff1a;添加明确的导入 …

【边缘计算与IoT】边缘计算的概念和在IoT中的应用

边缘计算与IoT&#xff1a;边缘计算的概念和在IoT中的应用 目录 引言边缘计算的概念 什么是边缘计算边缘计算的工作原理 边缘计算的优势 低延迟带宽优化数据隐私和安全高可靠性 边缘计算在IoT中的应用 智能家居工业自动化智慧城市医疗健康 边缘计算的技术挑战 计算资源限制数…

PHP完整表单实例

在PHP中创建一个完整的表单实例涉及多个步骤&#xff0c;包括设计HTML表单、处理表单提交、验证用户输入以及&#xff08;可选地&#xff09;将数据存储到数据库。以下是一个详细的教程&#xff0c;指导你完成整个过程。 第一步&#xff1a;设计HTML表单 首先&#xff0c;你需…

长上下文语言模型与RAPTOR 方法

在科技领域的前沿&#xff0c;长上下文语言模型&#xff08;Long Context LLMs&#xff09;和新兴检索方法如RAPTOR 正在引发广泛关注。本文将围绕这些技术展开讨论&#xff0c;并探讨它们在实际应用中的创新性和科技性。 长上下文语言模型的崛起 近几周来&#xff0c;随着新型…

在Windows中使用命令行将文件夹内txt文件合并成一个

打开命令提示符窗口导航到包含要合并的TXT文档的文件夹中。命令示例&#xff1a;cd C:\MyFiles在命令提示符窗口中键入以下命令&#xff1a;copy *.txt combined.txt按Enter键运行该命令。所有.TXT文档将合并到名为“Combined.TXT”的新文件中。

基于springboot+vue+uniapp的戏曲文化苑小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

判断一个变量是数组还是对象

很多人看到标题就会想到使用typeof运算符&#xff0c;但是实际上有些它判断不了 var a [1,2,3] console.log(typeof a) // "object"//总结&#xff1a; typeof运算符并不能直接判断一个变量是对象还是数组&#xff0c; //实际上&#xff0c;typeof运算符在判断基本…