C++make_pair,你真的懂了吗?

其实写这篇文章我还是很忐忑的,因为用C++也写了快一年了,平时代码量个人认为还可以,但是最近两天频繁犯错,下面先说说我写的错误吧!

我们都知道make_pair返回的是一个pair类型的函数,而pair这个键值对它又是我们再用STL中map,unordered_map等容器必不可少的类型,所以平时我们插入都会写成make_pair这个函数,因为这样它不仅方便,更是高了代码美观性,是的代码看起来非常的简洁。那么,我们到底应该注意些什么呢?

先来看看下面的代码:

#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
using namespace std;
int main()
{
    string a = "hello";
    string b = "world";
    unordered_map<string &, string &> um;
    um.insert(make_pair(a,b));
    return 0;
}

其实这个代码的错误我们一眼就看出来,类型与unordered_map的类型不匹配,但是我想问下,如果此时插入的话,用make_pair怎么插入呢?其实很明显,这里是不可以用make_pair直接插入的,有些人可能就迷惑了,为啥不能用make_pair啊?如果代码是这样的呢?

#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
using namespace std;
int main()
{
    string a = "hello";
    string b = "world";
    unordered_map<string &, string &> um;
    um.insert(make_pair("hello","world"));
    return 0;
}

这样其实是也是错误的,也是类型不匹配,这个类型编译器会识别成const char*,所以此时这这哦那个情况是不可以用make_pair的,用pair时最好的。稍后解释原因,我们再来看一段代码:

#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
using namespace std;
int main()
{
    string a = "hello";
    string b = "world";
    unordered_map<string &, string &> um;
    um.insert(make_pair<string&, string&>(a, b);
    return 0;
}

有些人可能就想,make_pair也是模版函数,那我就显示传参,然后在插入,事实证明,这也是错误的。C++98中,make_pair是这样的,如下:

别忘了,暂且先不说上述代码对不对,就先说说就算是代码是对的,那么此时make_pair返回的是一个匿名的pair类型,也就是说,在插入的时候因为用的不是emplace,所以它势必还会拷贝构造一次,但是此时它的值是不可以拷贝的,引用怎么拷贝?我们没见过说是拷贝引用吧?且先不说这个unordered_map这个插入,就是你自己平时如果实例化两个pair类型的对象,这两个对象势必不同,也就是咱们所说的深拷贝,所以,此时不可以用make_pair。其次,这个代码压根就是错误的,都过不了编译,怎么跑,所以绕来绕去就又回来了,为啥错了,其实这里在vs上可以清楚的看到,虽然你显示的传了string&,但是编译器会给你加一个std::remove_reference_t这个类型,它的功能是去除引用,所以此时构建的pair类型是pair<string,string>的,所以导致编译出现报错,所以这理最好是使用pair,先不说不方便还是其他的,就光光是把make_pair显示的写出了模版类型,这就已经和pair差不多了,且make_pair还是错误的。

而C++11干脆直接是右值引用,其中使用了完美转发,用了万能引用,如下:

这个其实也和上面的问题一样,就算显示的传了模版类型,和上面的还是一样的问题,就不再多说了。

而我个人感觉这个平时应该也不会有朋友发现这的错误吧,而我昨天写代码的时候,我用了unordered_map这个容器,而我用的类型是int,unique_ptr&,的类型,导致我用智能指针引用的原因是unique_ptr是不可以拷贝的,所以只能用引用,这才导致了前面的错误,上网查了很多,也没发现什么,然后就是自己看cplusplus网页,又在vs2019上写了一遍才发现。实在是很惭愧,快一年了,什么也没干,光写代码了,到头来还是一堆错误,不知道大家有什么遇见的错误,希望可以分享一下哦。

如果本篇文章对你有用的话,希望点赞收藏一下吧!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go语言(一)----声明常量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

二二复制模式玩法解析

这个模式和小编介绍的其他模式不同&#xff0c;其他的模式都是需要一个推荐来获得返利或者免单的&#xff0c;但是这个模式是不需要的&#xff0c;因为它可以依靠平台来完成闭环。 具体是怎么操作的呢&#xff1f;这个模式很简单&#xff0c;只有两个奖励。一个是直推奖&#x…

C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针

入门知识已经梳理完毕了&#xff0c;接下来就进入到面型对象的部分学习了 文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1类的结构3.2类的两种定义方式3.2.1声明和定义全部放在类体中3.2.2声明和定义分开 3.3成员变量命名规则的建议 4.类的访问限定符及封装4.1…

Java-NIO篇章(2)——Buffer缓冲区详解

Buffer类简介 Buffer类是一个抽象类&#xff0c;对应于Java的主要数据类型&#xff0c;在NIO中有8种缓冲区类&#xff0c;分别如下&#xff1a; ByteBuffer、 CharBuffer、 DoubleBuffer、 FloatBuffer、 IntBuffer、 LongBuffer、 ShortBuffer、MappedByteBuffer。 本文以它的…

【Linux】nc 网络诊断 | 文件传输 命令详解

目录 一、命令简介 二、命令使用 2.1 测试服务器 2.2 端口连通性测试 2.2.1tcp端口连通性测试 2.2.2udp端口连通性测试 2.3 文件及目录的传输 2.3.1 文件传输(TCP端口) 2.3.2 文件传输(UDP端口) 相关文章&#xff1a; 【网络】抓包工具Wireshark下载安装和基本使用教…

EasyConnect客户端 连接时提示,获取服务端配置信息失败

环境&#xff1a; EasyConnect客户端 问题描述&#xff1a; EasyConnect客户端 连接时提示&#xff0c;获取服务端配置信息失败 解决方案&#xff1a; 1.电脑上的防火墙和杀毒软件建议关闭,右键以管理员身份运行EasyConnect客户端使用(临时解决本案例) 2.用修复工具修复测…

maxwell同步全量历史数据

CentOS安装maxwell 在上篇的基础上&#xff0c;我们实现了实时同步mysql数据到kafka。maxwell不仅可以同步实时数据&#xff0c;也可以同步全量历史数据。在这里模拟一下历史数据的场景&#xff0c;创建表结构如下&#xff0c;并写入测试数据。 CREATE TABLE user_det…

手把手教你搭建3D元宇宙场景!

AMRT3D引擎一经上线&#xff0c;便立即引起了3D爱好者们的热烈反响。许多用户纷纷下载了此引擎&#xff0c;并开始认真学习和使用它。 有的用户甚至只用了一天的时间&#xff0c;就已经可以利用AMRT3D引擎搭建出一个3D项目。这充分说明了AMRT3D引擎的强大和高效&#xff0c;也…

代码随想录算法训练营第31天 | 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

目录 理论基础 455.分发饼干 &#x1f4a1;解题思路 &#x1f4bb;实现代码 376. 摆动序列 &#x1f4a1;解题思路 # 情况一&#xff1a;上下坡中有平坡 # 情况二&#xff1a;数组首尾两端 情况三&#xff1a;单调坡度有平坡 &#x1f4bb;实现代码 53. 最大子序…

matlab快速入门(读取数据并绘制散点图和拉格朗日插值

目录 1.读取excel&#xff1a;2.注释快捷键&#xff1a;3.数组/矩阵索引&#xff1a;4.绘制散点图&#xff1a;5.拉格朗日插值&#xff1a;5.1分割出非空和空的x和y两组数据&#xff1a;5.2插值&#xff1a;5.3画图&#xff1a; 小结&#xff1a; 1.读取excel&#xff1a; [nu…

抖店商家怎么维护好与达人关系?2024新版维护达人思路方法

我是王路飞。 当你找到达人给你带货&#xff0c;且积累了一些达人资源之后&#xff0c;就需要维护好与达人的关系了。 毕竟找达人带货玩法的好处&#xff0c;就是长期稳定&#xff0c;他能给你带来持续的收益。 那么抖店商家应该如何维护好与达人的关系呢&#xff1f; 这篇…

第4章 通信系统

文章目录 4.1.1 基本概念4.1.2 通信系统的组成1、通信系统的一般模型2、模拟通信系统3、数字通信系统 4.1.3 通信系统分类与通信方式1、通信系统分类2、通信方式 4.1.4 通信系统的性能指标&#xff08;质量指标&#xff09;4.2 信源编码4.2.1 信源的概念与特性4.2.2 信源编码概…

【Python学习】Python学习20- 面向对象(2)

目录 【Python学习】Python学习20- 面向对象&#xff08;2&#xff09; 前言类的继承特点实例 方法重写基础重载方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的面向对象的处理。 类的继承 通过继承创建的新类称为子类或派生类&#xff0c;被继承的类称为基…

网页设计(八)HTML5基础与CSS3应用

一、当当网企业用户注册页面设计 当当网企业用户注册页面 改版后当当网企业用户注册页面 <!-- prj_8_1.html --> <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>当当网企业用户注册页面设计</title><s…

2024年美赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

Eclipse搭建python环境

一、下载eclipse eclipse官网下载参考链接 二、 下载PyDev ​PyDev 三、安装和配置pyDev 下载完PyDev&#xff0c;解压之后是下面两个文件夹&#xff0c;我下载的版本是PyDev 7.7 ,然后拷到eclipse对应的目录下就可以 四、然后新建一个python程序 1.新建一个项目 ​​…

2024-01-17复盘和总结

今日复盘 今天是我失业的第一天&#xff0c;心里有点难受&#xff0c;但是没办法&#xff0c;生活需要继续。 1.做了什么&#xff1f; 今天早上9点出发&#xff0c;骑电动车去了闵行区的图书馆&#xff0c;在图书馆里优化了简历&#xff0c;把word版的简历变成了pdf版的简历…

Ceph分布式存储(1)

目录 一.ceph分布式存储 Ceph架构&#xff08;自上往下&#xff09; OSD的存储引擎&#xff1a; Ceph的存储过程&#xff1a; 二. 基于 ceph-deploy 部署 Ceph 集群 20-40节点上添加3块硬盘&#xff0c;一个网卡&#xff1a; 10节点为admin&#xff0c;20-40为node&…

数据结构与算法:归并排序

数据结构与算法&#xff1a;归并排序 归并思想递归法非递归 归并思想 在讲解归并排序前&#xff0c;我们先看到一个问题&#xff1a; 对于这样两个有序的数组&#xff0c;如何将它们合并为一个有序的数组&#xff1f; 在此我们处理这个问题的思路就是&#xff1a;开辟一个新的…

Java数据结构实现数组(配套习题)

数据结构 数组 一组相同数据类型的集合 特点 数组在内存中是连续分配的创建时要指明数组的大小数组名代表首地址,索引从0开始,到数组的长度-1数组一旦创建好,大小不可以改变使用索引 获取索引位置的值 arr[index]修改 arr[index] val删除 (假删除)遍历,将数组中的元素,依次…