C++17新特性之try_emplace与insert_or_assign

2023-11-17

由于std::map中,元素的key是唯一的,我们经常遇到这样的场景,向map中插入元素时,先检测map指定的key是否存在,不存在时才做插入操作,如果存在,直接取出来使用,或者key不存在时,做插入操作,存在时做更新操作。

通用的做法,可以直接用emplace操作,判断指定的key是否存在,如果不存在,则插入元素,当元素存在的时候,emplace依然会构造一次带待插入元素,判断不需要插入后,将该元素析构,这样导致的后果是,产生了多余的构造和析构操作。

鉴于此,C++17引入了std::try_emplace,在参数列表中,把key和value分开,该方法会检测指定的key是否存在,如果存在,什么也不做,不存在,则插入相应的value。

此外,C++17为map容器还新增了insert_or_assign方法,让我们无需像之前一样,额外编写先判断是否存在,不存在则插入,存在则更新的代码了。

废话不多说,看简单的demo实例代码:

#include "stdafx.h"
#include <iostream>
#include <map>

using namespace std;

void PrintMap(const string& type, const map<string, int>& val)
{
	cout << type << endl;

	for (const auto& [user, age] : val)
	{
		cout << user << ":" << age << endl;
	}
}

int main()
{
	map<string, int> map_user_age = { {"Tom", 10}, {"Jerry", 12}, {"Neo", 13} };

	PrintMap("original map", map_user_age);

	auto [iter_tom, inserted_tom] = map_user_age.try_emplace("Tom", 14);

	PrintMap("insert Tom:14(try_emplace)", map_user_age);

	auto [iter_jim, inserted_jim] = map_user_age.try_emplace("Jim", 14);
	
	PrintMap("insert Jim:14(try_emplace)", map_user_age);

	auto [iter_neo, inserted_neo] = map_user_age.insert_or_assign("Neo", 18);

	PrintMap("insert Neo:18(insert_or_assign)", map_user_age);

	auto [iter_tom_ia, inserted_tom_ia] = map_user_age.insert_or_assign("Tom", 16);

	PrintMap("insert Tom:16(insert_or_assign)", map_user_age);
		
	return 0;
}

猜一猜运行结果:

上述实例代码可以看到:insert_or_assign方法与 try_emplace的不同之处在于,如果对应的key已经存在,使用insert_or_assign会将新的value值赋值给已经存在的key(建立新的键值对映射)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++17新特性之try_emplace与insert_or_assign 的相关文章

随机推荐

  • verilog基本语法总结

    最近学习了verilog基本语法 总结如下 数值表示 Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑 0 逻辑 0 或 假 1 逻辑 1 或 真 x 或 X 未知 z 或 Z 高阻 整数数值表示方法 十进制 d 或 D
  • Java使用 java.util.regex.Pattern 正则表达式校验参数值是否规范

    场景 java中我们可以利用 Pattern 注解对某个入参进行规则校验 但有些特殊参数在接口入口处不方便校验 需要在代码中校验 一 使用 Pattern 注解校验 Pattern regexp a zA Z0 9 message xxx号
  • JVM学习笔记---Java内存模型

    12 1 Java内存模型 Java内存模型 Java Memory Model 是Java虚拟机规范中定义的 用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异 以实现让Java程序在各种平台下都能达到一致的内存访问效果
  • echarts的tooltip旋转方案

    当echarts横屏的时候 tooltip还是原来的角度 没有跟着旋转过来 官网说可以使用extraCssText来旋转 但是我测过了无效 extraCssText transform rotate 270deg 详细看了一下官网 发现可以
  • Scanner类中next()和nextLine()的区别

    详解Scanner类中next 和nextLine 的区别 Scanner类中的next 和nextLine 方法是我们经常使用的键盘录入方法 那么两者之间有何不同呢 next 从控制台获取字符串 如果字符串中包含空格 只会获取空格前前的字
  • python的requests请求https时,与fiddler冲突造成ssl错误

    目录 原因 解决方案 把fiddler关掉就好 去掉requests的ssl验证 保持fiddler和requests的证书一致 使用从浏览器导出证书 可以放到代码目录下 走fiddler代理 使用fiddler导出的证书 要用openss
  • 亚马逊(Amazon)公共开发者注册步骤

    亚马逊公共开发者注册步骤 持续更新 第一步 创建AWS账号 第二步 创建角色 第三步 亚马逊后台申请开发者 第一步 创建AWS账号 到AWS平台上面注册一个账号信息 资料啥的就填你自己的吧 这块操作很简单 AWS注册链接 注册完直接登录 进
  • Pocket Yoga for mac:一个神奇的瑜伽助手,让你的身心更健康

    Pocket Yoga for Mac 口袋瑜伽 是一款专为瑜伽爱好者设计的应用程序 无论您是初学者还是经验丰富的瑜伽修行者 这款应用都能帮助您在家中或办公室进行高效的瑜伽练习 Pocket Yoga for Mac提供了一系列的瑜伽课程和
  • Integer、new Integer、int之间的区别与比较

    最近面试代码分析题频繁遇到 所以就此做一个整理与回顾 希望能帮到大家 如有错误欢迎纠正 这里先说一下这三种类型分别是什么 int int是java中的一种基本数据类型默认值为0 Integer int的包装类 默认值为null new In
  • flask框架和配置

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 flask框架介绍 flsak框架的安装 实现Flask基本操作 Flask的配置 flask框架介绍 Flask诞生于2010年 使用python语言基于Werk
  • 通过 docker-compose 搭建高可用 nginx + keepalived 集群

    目录 1 搭建环境 2 Keepalived介绍 3 搭建步骤 1 搭建环境 两台虚拟机 CentOS Linux release 7 9 2009 Core Docker version 23 0 1 Docker compose ver
  • 小知识记录

    1 加URL地址栏上的图标 在jsp文件中写 在webroot下加入此图片 并且把名字换成 favicon ico 2 处理并发 读一致性 隔离级别 脏读 不可重复读 幻影读 同步锁 乐观锁 数据版本 Version 记录机制实现 悲观锁
  • 一文弄懂Ubuntu安装配置方法(挂载、SSH、用户管理)

    Ubuntu安装配置方法 挂载 SSH 用户管理 这篇文章是本人使用Ubuntu四年来 对常用操作的总结 需要的同学可以保存备用 安装Ubuntu U盘安装 注意安装英文版的为佳 挂载分区 最好切换到root 确定要挂载的分区和目录 查看已
  • 设计数组工具类、日期工具类;线程模拟多窗口售票流程;总结内部类访问方式;区分数值和字符串并排序;猜四位数小游戏

    文章目录 1 设计可存储不同长度 兼容多种类型数组工具类 2 控制台随机输入数值或字符串 区分出数值和字符串 从小到大输出 要求 个数 类型不限 去除重复 3 设计日期工具类 兼容jdk5 8 4 总结内部类访问方式 内部类特性 静态内部类
  • python自己写包_自己写python包

    广告关闭 腾讯云11 11云上盛惠 精选热门产品助力上云 云服务器首年88元起 买的越多返的越多 最高返5000元 packages find packages exclude tests exmaple 所有包除了tests和exmapl
  • Docker容器与虚拟化技术:GitHub账户注册

    目录 一 实验 1 GitHub 一 实验 1 GitHub 1 GitHub是一个面向开源及私有软件项目的托管平台 因为只支持Git作为唯一的版本库格式进行托管 故名GitHub 2 官网 GitHub Let s build from
  • ArcGIS构建缓冲区,合并两个重叠的面

    问题描述 需要构建线缓冲区 并将重叠的缓冲区合并成一个面要素 不相邻的不需要合并 解决思路 构建缓冲区 并进行融合 相关工具描述 ArcMap提供的缓冲区 buffer 工具 融合类型有三种 但ALL不能满足需求 联合 Union 工具 会
  • 集成FCM推送一系列问题

    FCM Firebase Cloud Messaging 首先集成FCM需要一定的条件 必要条件 Android2 3版本以上的手机和拥有Google service的框架应用和不在国内的网络 使用外网 第一国内的手机一般阉割了Google
  • 教你用Python爬网站数据,并用BI可视化分析!

    两年时间里曾经换过一份工作 一直都是从事大数据相关的行业 目前是一家企业的BI工程师 主要工作就是给业务部门出报表和业务分析报告 回想自己过去的工作成绩也还算是不错的 多次通过自己分析告 解决了业务的疑难杂症 领导们各种离不开 但安逸久了总
  • C++17新特性之try_emplace与insert_or_assign

    由于std map中 元素的key是唯一的 我们经常遇到这样的场景 向map中插入元素时 先检测map指定的key是否存在 不存在时才做插入操作 如果存在 直接取出来使用 或者key不存在时 做插入操作 存在时做更新操作 通用的做法 可以直