【C++11/17】std::map高效插入

我们在使用stl的映射容器std::map时,经常需要向容器中插入数据。由于map的元素key值是唯一的,我们经常遇到这样的场景:

  • 向map中插入元素时,指定的key已经存在则直接更新;
  • 指定的key不存在,然后才做插入操作;

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

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

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

#include <iostream>
#include <string>
#include <map>using namespace std;int main()
{map<string, string> mapTest{ {"花木兰","边路"},{"甄姬","中单"},{"后羿","射手"},{"蔡文姬","射手"},{"东方曜","打野"} };auto [hero, position] = mapTest.try_emplace("韩信", "第六人");for (auto [h, p] : mapTest){cout << h << ":" << p << endl;}cout << "--------------------------------------------------" << endl;auto [hero1, position1] = mapTest.try_emplace("东方曜","边路");for (auto [h, p] : mapTest){cout << h << ":" << p << endl;}cout << "--------------------------------------------------" << endl;auto [hero2, position2] = mapTest.insert_or_assign("东方曜", "边路");for (auto [h, p] : mapTest){cout << h << ":" << p << endl;}cout << "--------------------------------------------------" << endl;auto [hero3, position3] = mapTest.insert_or_assign("马超", "龙虎双边");for (auto [h, p] : mapTest){cout << h << ":" << p << endl;}return 0;
}

在这里插入图片描述

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

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

相关文章

oracle 监听 无法连接,oracle监听hang,无法建立新连接TNS-12540

TNS-12518: TNS:listener could not hand off client connectionTNS-12540: TNS:internal limit restriction exceeded监听无法建立新连接&#xff0c;报如上错误&#xff0c;请教各位大神是什么原因&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

pgd 游戏教程 基地

http://www.pascalgamedevelopment.com/content.php?417-Castle-Game-Engine-6-2-released转载于:https://www.cnblogs.com/delphi-xe5/p/7237464.html

oracle选择外键列,Oracle外键列上是否需要索引?

外键列上缺少索引会带来两个问题&#xff0c;限制并发性、影响性能。而这两个问题中的任意一个都可能会造成严重性能问题。 无论是Or外键列上缺少索引会带来两个问题&#xff0c;限制并发性、影响性能。而这两个问题中的任意一个都可能会造成严重性能问题。无论是Oracle的官方文…

select * 和select 所有字段的区别

文章取自http://blog.csdn.net/u014305991/article/details/44964171 MySQL 5.1.37 表记录数41,547,002&#xff0c;即4000w行 使用远程客户端取1000条数据&#xff0c;统计时间&#xff1a; SELECT * FROM dmsp.dmsp_dimension_content LIMIT 0, 1000; 时间2.218s&#xff0c;…

php的strpos不支持数字,php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创...

php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创这里有新鲜出炉的 PHP 面向对象编程&#xff0c;程序狗速度看过来&#xff01;PHP 开源脚本语言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;"超文本预处理器")是一种通用开源脚…

css动画详解 (transition animation)

属性 transition&#xff08;4个属性&#xff09;: transition: width 5s ease 3s; /*简写*/transition-property: width; /*过渡属性名*/transition-duration: 5s; /*持续时间&#xff0c;默认为0*/transition-timing-function: ease; /*速度*/transition-delay: 3s; /*延迟*…

php ajax session死锁,session过期,ajax请求处理

session会话过期&#xff0c;如果是请求。可以直接定位到页面。如果是ajax请求。无法跳转到页面。可以通过如下方式实现&#xff0c;在Response的输出流里面&#xff0c;向前端写一段html代码来实现。public boolean preHandle(HttpServletRequest request, HttpServletRespons…

NYOJ题目 263 精挑细选

题目描述&#xff1a; 小王是公司的仓库管理员&#xff0c;一天&#xff0c;他接到了这样一个任务&#xff1a;从仓库中找出一根钢管。这听起来不算什么&#xff0c;但是这根钢管的要求可真是让他犯难了&#xff0c;要求如下&#xff1a;1、 这根钢管一定要是仓库中最长的&…

充电桩系统php源码,源码 充电桩程序设计 - 下载 - 搜珍网

压缩包 : e0f671190e843b596bf8d7dfd98914.zip 列表源码/00/源码/00/delay.crf源码/00/delay.d源码/00/delay.o源码/00/gui.crf源码/00/gui.d源码/00/gui.o源码/00/inc/源码/00/inc/delay.h源码/00/inc/io_bit.h源码/00/inc/main.h源码/00/inc/stm32f10x_conf.h源码/00/inc/stm…

mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)

MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受 max_allowed_packet 参数限制&#xff0c;导致写入或者更新失败。查看目前配置&#xff1a; show VARIABLES like %max_allowed_packet%; 显示的结果为&#xff1a; ----------------------------- |…

linux命令行sip电话,基于Linux和MiniGUI的SIP电话终端设计

0 引言随着VoIP的迅猛发展&#xff0c;越来越多的个人用户正在使用软件电话、IP电话通过VoIP系统拨打国内和国际长途&#xff0c;IP电话的需求量越来越大&#xff0c;同时&#xff0c;人们对IP电话的要求也越来越高&#xff0c;例如要求IP电话体积小、方便携带、功耗低、待机时…

Maven--反应堆(Reactor)

在一个多模块的 Maven 项目中&#xff0c;反应堆是指所有模块组成的一个构建结构。对于单模块的项目&#xff0c;反应堆就是该模块本身。但对于多模块项目来说&#xff0c;反应堆就包含了各模块之间继承与依赖的关系&#xff0c;从而能够自动计算出合理的模块构建顺序。 模块间…

工作87:element-ui el-table sortable属性 参数详解

表格组件的排序功能,点击排序表头可以进行升序和降序进行排序 上代码 <el-table:data"tableData"style"width: 100%"<!-- 数据由后台进行排序时sortable"custom",需要监听排序点击事件,会返回当前的prop和order -->sort-change"c…

linux文件基础知识,linux文件系统基础知识

利用直接指针、单级间接指针、二级间接指针、三级间接指针可保存的最大文件大小为&#xff1a;1024*121024*2561024*256*2561024*256*256*25616843020 KB&#xff0c;约 16GB若数据块大小为2048B&#xff0c;指针占4B&#xff0c;则最大文件大小为&#xff1a; 2048*122048*512…