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

news2024/11/28 12:43:06

其实写这篇文章我还是很忐忑的,因为用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上写了一遍才发现。实在是很惭愧,快一年了,什么也没干,光写代码了,到头来还是一堆错误,不知道大家有什么遇见的错误,希望可以分享一下哦。

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

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

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

相关文章

MATLAB中simulink中scope同时显示两个输入信号

在使用scope时&#xff0c;需要两个输入信号的设置方法 1.点开scope图标 2 点击设置按钮&#xff0c; 然后弹出configuration properties&#xff1a;scope配置图&#xff0c;在Main选项下&#xff0c;在Number of input ports&#xff1a;1这里面更改数字&#xff0c;需要几…

【AI绘画】Midjourney到底是什么?看完就懂了!!!

手把手教你入门绘图超强的AI绘画&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 &#xff08;文末可获取&#xff09; 一、Midjourney 的原理 由 2022 年 3 月&#xff0c;美国一家工作室首次推出一款 AI 制…

Unity关于新手引导中实现遮罩镂空效果

在新手引导每一步中实现可以遮掉其他部分而显示当前需要点击的部分&#xff0c;只需要在每一步引导的时候设置对应的镂空区域的RectTransform.效果如下图&#xff1a; 代码&#xff1a; public class SelfMaskSet : MaskableGraphic, ICanvasRaycastFilter {[SerializeField]p…

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…

Linux下安装Mysql【CentOS7 】

Linux下安装Mysql 一、Linux下安装Mysql-5.7.41【tar包下载安装】1.1.首先检查是否已经安装过mysql1.2.下载Linux版本的Mysql-5.71.3.解压缩1.4.安装执行 rpm 安装包需要先下载 openssl-devel 插件1.5.安装 Mysql5.7 执行 rpm 安装包1.6.Mysql相关操作命令1.7.查看Mysql-5.7 临…

2024年【危险化学品生产单位主要负责人】免费试题及危险化学品生产单位主要负责人实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位主要负责人免费试题考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位主要负责人实操考试视频题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位主要…

在ubuntu上交叉编译NVIDIA Jetson的arm64应用程序

在使用orin的时候,由于orin上的cpu编译速度较慢还有其他一些原因没有在自己电脑ubuntu上的x86上直接编译方便。直接在x86上编译出来的程序由于平台不同是不能在arm平台上运行的,要在x86上编译出arm平台的程序需要使用交叉编译工具。 1.在nvidia官网Jetson Linux Archive | N…

直流继电器 JT3-22/5 线圈电压DC220V电磁式 柜内固定安装 JOSEF约瑟

JT3系列直流继电器 系列型号 JT3-42/3电磁继电器;JT3A-40/3电磁继电器 JT3-11/3电磁继电器;JT3A-03/3电磁继电器 JT3-30/3电磁继电器;JT3A-20/3电磁继电器 JT3-02/3电磁继电器;JT3A-12/3电磁继电器 JT3-22/1电磁继电器;JT3A-24/1电磁继电器 JT3-42/1电磁继电器;JT3A-31/1电磁…

【已解决】c语言const/指针学习笔记

本博文源于笔者正在复习const在左与在右&#xff0c;指针优先级、a,&a,*a的区别。 1、const在左与在右 int const *p const int *p int * const p int const * const p const int * const p* 在const右边&#xff0c;指向的数据不可以改变&#xff0c;可以改变地址 * 在c…

二叉树【Java】

文章目录 一、树型结构二、二叉树2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的遍历 三、二叉树的基本操作3.1获取树中节点的个数3.2获取叶子节点的个数3.3获取第K层节点的个数3.4获取二叉树的高度3.5检测值为value的元素是否存在 一、树型结构 树是一种非线性的数据…

Rust 错误处理(下)

目录 1、用 Result 处理可恢复的错误 1.1 传播错误的简写&#xff1a;? 运算符 1.2 哪里可以使用 ? 运算符 2、要不要 panic! 2.1 示例、代码原型和测试都非常适合 panic 2.2 当我们比编译器知道更多的情况 2.3 错误处理指导原则 2.4 创建自定义类型进行有效性验证 …

欧盟玩具CE认证标准EN71详细介绍

玩具EN71认证简介 EN71是欧盟市场玩具类产品的规范标准。许多国家都就这些产品建立了自己的安全规章&#xff0c;生产公司必须保证其产品在该地区销售前符合相关标准。制造商必须对因生产缺陷、不良设计或不适当材料的使用而导致的事故负责。由此在欧洲推出玩具EN71认证法令&am…

设计模式-创建者模式

1.单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 使用单例模式要做的两件事 1. 保证一个类只有一个实例 2.…

【UE5】交互式展厅数字博物馆交互是开发实战课程

长久以来&#xff0c;我们总是不断被初学者问到类似这样的问题&#xff1a;如何从头到尾做一个交互式程序开发项目&#xff1f;本套课程尝试对这个问题进行解答。 课程介绍视频如下 【UE5】数字展厅交互式开发全流程 【谁适合学习这门课】 本套课程面向初学者&#xff0c;满足…

关于C#中Monitor的wait/pulse的理解

wait&#xff1a;表示释放对象上的锁并阻止当前线程&#xff0c;直到它重新获取该锁。 pulse&#xff1a;表示通知等待队列中的线程锁定对象状态的更改。 当线程调用 Wait 时&#xff0c;它会释放对象上的锁并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个…

【数据库】聊聊数据库中的 fetchsize 参数

聊聊数据库中的 fetchsize 参数 1.介绍2.案例3.MySQL 中的 fetchsize4.Oracle 中的 fetchsize 1.介绍 在使用查询语句的时候&#xff0c;经常需要根据条件来进行查询得到最终的总记录条数&#xff0c;然后得到结果之后需要来进行处理。 场景&#xff1a;Java 端从数据库读取 …

【数据结构与算法】之数组系列-20240117

这里写目录标题 一、167. 两数之和 II - 输入有序数组二、164. 最大间距三、128. 最长连续序列四、122. 买卖股票的最佳时机 II五、78. 子集六、75. 颜色分类 一、167. 两数之和 II - 输入有序数组 中等 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递…

【python】基础知识类的语法功能讲解

Python代码定义了一个名为Calculation的类&#xff0c;用于执行基础的数学运算&#xff08;加法、减法、乘法、除法和取模&#xff09;。下面我将详细解释各个部分的功能&#xff0c;并以列表形式总结&#xff1a; 类定义&#xff1a; class Calculation: 定义了一个名为Cal…

Simulink|双机并联自适应虚拟阻抗下垂控制仿真模型

目录 主要内容 模型研究 结果一览 下载链接 主要内容 风电高渗透率下&#xff0c;电力系统对风电场频率调节能力提出了技术要求。考虑风机惯性控制和变桨距控制的频率响应能力&#xff0c;提出将储能与风电自身调频手段相结合&#xff0c;参与系统频率调节。模型…

JSP简单学习

jsp是在html中嵌入java代码 jsp也是在j2ee服务端中的java组件 第一次运行 在第一次运行jsp代码时会经历以下步骤&#xff0c;将jsp转为java代码&#xff0c;将java代码转为class文件。 所以通常会比较慢&#xff0c;编译后就好多了。 四大作用域 requestsessionpageapplica…