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

本文讲述了在C++中使用make_pair插入unordered_map时遇到的类型不匹配问题,包括常量指针、显式模板类型传递和智能指针的引用。作者通过实例和编译器分析揭示了错误原因并强调了正确使用pair的重要性。
摘要由CSDN通过智能技术生成

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值