C++17新特性之try_emplace与insert_or_assign

由于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(建立新的键值对映射)。

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

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

相关文章

Foxmail邮件字体大小怎么设置 Foxmail字体的设置方法

Foxmail写邮件的时候&#xff0c;想要设置邮件的字体&#xff0c;和字体大小&#xff0c;该怎么设置呢?下面我们就来看看详细的教程。 Foxmail邮件字体大小怎么设置? Foxmail字体的设置方法 1、下载并安装Foxmail邮件客户端。 Foxmail邮件字体大小怎么设置? Foxmail字体的…

C++11/14/17中提供的mutex系列区别

C11/14/17中提供的mutex系列类型如下&#xff1a; 互斥量 C版本 作用 mutex C11 基本的互斥量 timed_mutex C11 timed_mutex带超时功能。在规定的等待时间内&#xff0c;没有获取锁&#xff0c;线程不会一直阻塞&#xff0c;代码会继续执行 recursive_mutex C11 递归…

Unity环境下实现Camera高帧率RTMP推送

Unity下RTMP直播背景方面不再赘述&#xff0c;今天主要讨论的是&#xff0c;Unity环境下&#xff0c;如何实现Camera高帧率RTMP推送&#xff0c;这里提到的高帧率&#xff0c;不再局限于常规环境下的30帧&#xff0c;以VR头显为例&#xff0c;更高的帧率&#xff08;比如50帧&a…

Outlook2010怎么关联邮箱 Outlook邮箱关联的教程

Outlook想要关联自己的邮箱&#xff0c;该怎么关联呢?下面我们就来看看详细的教程。 1、首先我们登录进入我们的Outlook&#xff0c;点击文件-添加账户 Outlook2010怎么关联邮箱? Outlook邮箱关联的教程 2、之后进入我们的添加账户导航&#xff0c;选择第一个电子邮件 Ou…

如何在Android平台GB28181接入终端实现语音广播和语音对讲

技术背景 在之前的blog&#xff0c;我们以Android平台国标接入终端为例&#xff0c;分别介绍了一些常规的功能&#xff0c;比如REGISTER、CATALOG、INVITE、Keepalive、SUBSCRIBE、NOTIFY等常规操作&#xff0c;今天主要介绍下语音广播和语音对讲这部分。 GB28181平台广播和对…

Android GB28181设备接入端语音广播和语音对讲技术实现探究

上篇文章提到Android端GB28181接入端的语音广播和语音对讲的实现&#xff0c;从spec角度大概介绍了下流程和简单的接口设计&#xff0c;好多开发者私信我&#xff0c;希望展开说一下。其实这块难度不大&#xff0c;只是广播和对讲涉及到双向实现&#xff0c;如果之前没有相关的…

微信公众号页面模版怎么添加文章推荐功能

微信公众号中发布的文章可以添加推荐的文章&#xff0c;该怎么添加文章推荐功能呢?下面我们就来看看详细的教程。 微信公众号页面模版怎么添加文章推荐功能? 1、登录微信公众平台&#xff0c;选择“功能”——“页面模板”——“添加模板” 微信公众号页面模版怎么添加文章…

Android native层实现MediaCodec编码H264/HEVC

Android平台在上层实现mediacodec的编码&#xff0c;资料泛滥&#xff0c;已经不再是难事&#xff0c;今天给大家介绍下&#xff0c;如何在Android native层实现MediaCodec编码H264/HEVC&#xff0c;网上千篇一律的接口说明&#xff0c;这里不再赘述&#xff0c;本文主要介绍下…

edge浏览器运行不流畅怎么办 提高edge浏览器速度的方法

edge浏览器是win10系统的专用浏览器&#xff0c;它代替了慢吞吞的IE&#xff0c;很多人觉得edge浏览器运行速度快&#xff0c;但是有时候浏览某些网站的时候会不流畅&#xff0c;所以怎么提高edge浏览器的运行速度呢&#xff0c;小编就来教教大家。 1、打开Edge浏览器后&#…

GB/T 28181联网系统通信协议结构和技术实现

技术回顾 在本文开头&#xff0c;我们先一起回顾下GB/T28181联网系统通信协议结构&#xff1a; 联网系统在进行视音频传输及控制时应建立两个传输通道&#xff1a;会话通道和媒体流通道。 会话通道用于在设备之间建立会话并传输系统控制命令&#xff1b;媒体流通道用于传输视…

Android平台GB28181设备接入端对接编码前后音视频源类型浅析

前言 今天主要对Android平台GB28181设备接入模块支持的接入数据类型&#xff0c;做个简单的汇总&#xff1a; 编码前数据&#xff08;目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型&#xff09;&#xff0c;其中&#xff0c;Android平台前后摄像头数据&…

搜狗高速浏览器怎么设置页面字体 设置方法介绍

搜狗高速浏览器是由搜狗公司开发的一款浏览器应用&#xff0c;我们在使用电脑或者手机等设备时都是离不开浏览器应用的&#xff0c;并且在很多浏览器中有的功能都是可以根据用户的使用习惯和喜好来设置的&#xff0c;就比如页面字体&#xff0c;所以小编今天就来跟大家分享一下…

C++学习之-析构函数必须为虚函数吗?

今天讨论个比较有意思的话题&#xff1a;析构函数是不是必须要为虚函数&#xff1f; 先说答案&#xff1a; 析构函数可以是虚函数&#xff0c;也可以不是虚函数。 再说原因&#xff1a; 析构函数为虚函数的情况&#xff1a;继承 当父类指针释放子类对象时&#xff0c;如果…

如何实现RTMP或RTSP播放端回调YUV/RGB数据?

今天某乎收到个问题推荐&#xff0c;如何实现RTSP回调YUV数据&#xff0c;用于二次处理&#xff1f; 正好前些年我们做RTSP和RTMP直播播放的时候&#xff0c;实现过相关的需求&#xff0c;本文就以Android为例&#xff0c;大概说说具体实现吧。 先说回调yuv或rgb这块意义吧&a…

Win7系统打印机删除不掉的解决方法

在Win7系统下&#xff0c;如果想要把安装的打印机删除&#xff0c;通常会在设备和打印机里删除打印机图标&#xff0c;但是一些用户反馈&#xff0c;用户在删除了打印机之后&#xff0c;只要一刷新打印机又会重新出现&#xff0c;感觉是删除不了&#xff0c;那么Win7系统打印机…

GB/T28181-2016传输要求和Android平台设备接入技术实现

相关协议规范 GB/T28181-2016公共安全视频监控联网系统 信息传输、交换、控制技术要求相关的传输要求如下&#xff1a; 5.1 网络传输协议要求 联网系统网络层应支持IP协议,传输层应支持 TCP和 UDP协议。 5.2 媒体传输协议要求 视音频流在基于IP的网络上传输时应支持 RTP/R…

无法打开Win11系统小组件怎么办

Win11操作系统也推出一段时间了&#xff0c;不少小伙都有下载体验&#xff0c;Win11与之前的Win10比较起来改动非常大&#xff0c;小组件是Win11系统中全新添加的功能&#xff0c;他类似于Win10最新的加入的兴趣模块&#xff0c;但是有朋友遇到了小组件无法打开的情况这是怎么回…

GB28181控制、传输流程和协议接口之注册|注销和技术实现

注册和注销基本要求 SIP客户端、网关、SIP设备、联网系统等 SIP代理(SIP UA)使用IETFRFC3261中定义的方法 15 GB/T28181—2016Register进行注册和注销。 注册和注销时应进行认证&#xff0c;认证方式应支持数字摘要认证方式&#xff0c;高安全级别的宜支持数字证书的认证方式&…

Edge浏览器网页怎么收藏 Edge浏览器网页收藏图文教程

Edge浏览器是微软最新推出的网页浏览工具。而现在有很多Edge浏览器新用户可能对它不是很了解&#xff0c;在使用过程中会出现小问题。今天小编就为大家解答Edge浏览器网页怎么收藏&#xff0c;一起来看教程吧! Edge浏览器网页收藏图文教程 一、怎么收藏网页? 1、打开Edge浏…

GB28181状态信息报送解读及Android端国标设备接入技术实现

今天主要聊聊GB/T28181状态信息报送这块&#xff0c;先回顾下协议规范相关细节&#xff0c;然后再针对代码实现&#xff0c;做个简单的说明。 状态消息报送基本要求 当源设备(包括网关、SIP设备、SIP客户端或联网系统)发现工作异常时,应立即向本 SIP监控域 的SIP服务器发送状…