C++ 11 pair
class pair 可将两个 value视为一个单元。C++标准库内多处用到了这个 class 。尤其是容器 map、multimap、unordered_map和 unordered_multimap就是使用 pair 来管理其以 key/value pair形式存在的元素。任何函数如果需要返回两个 value,也需要用到 pair,例如 minmax()
pair的结构定义于<utility>,且提供如下所示各种操作:

原则上你可以对pair<>执行 creat,copy/assign/swap及compare操作。此外它还提供first_type和second_type类型定义式,用来表示第一 value和第二 value的类型。
元素访问
为了让程序能够处理pair的两个值,它提供了“直接访问对应数据成员”的能力。事实上由于它是个 struct而不是class,以至于所有成员都是public:
namespace std
{
template<typename T1,typename T2>
struct pair
{
T1 first;
T2 second;
};
}
如果要实现一个泛型函数模板,用以将一个 value pair写入一个stream内,你必须:
template<typename T1, typename T2>
std::ostream& operator<<(std::ostream& strm, const std::pair<T1, T2>& p)
{
return strm << "[" << p.first << "," << p.second << "]";
}
另外,自C++11起,你可以对pair使用一份tuple-like接口。因此,你可以使用tuple_size<>::value获得元素个数,使用 tuple_element<>::type获得某指定元素的类型,也可以使用get()获得first或second;
typedef std::pair<int, float> InFloatPair;
InFloatPair p(42, 3.14);
int main()
{
std::get<0>(p);// p第一个元素。
std::get<1>(p);// p第二个元素。
std::tuple_size<InFloatPair>::value;//获取pair元素个数
std::tuple_element<0, InFloatPair>::type;//获取队组中第一个元素的类型。
}
构造函数与赋值
Default 构造函数生成一个 pair 时,以两个“被 default构造函数个别初始化”的元素作为初值。根据语言规则,基础类型(如 int)的default构造函数也可以引起适当的初始化行为。
例如:
std::pair<int, float>p;
上述形式就是以 int()和 float()来初始化p。这两个构造函数都穿回 0值。
Copy构造函数同时存在两个版本,版本1接受相同类型的pair,版本2是个member template,在“构造函数需要隐式类型转换”时被调用。如果 pair对象被复制,调用的是被隐式合成的那个copy构造函数。例如:
上述形式就是以 int()和 float()来初始化p。这两个构造函数都穿回 0值。
Copy构造函数同时存在两个版本,版本1接受相同类型的pair,版本2是个member template,在“构造函数需要隐式类型转换”时被调用。如果 pair对象被复制,调用的是被隐式合成的那个copy构造函数。例如:
void f(std::pair<int, const char*>);
void g(std::pair<const int, std::string>);
void foo()
{
std::pair<int, const char*> p(42, "hello");
f(p);//直接调用
g(p);//具有const char*到 string 的隐式类型转换
}
自C++11开始,如果 pair<>用到了某个类型而该类型只有一个 非常数(nonconstant)的拷贝构造函数,将不在编译成功:
逐块式构造
Class pair<>提供了三个构造函数,用以初始化 first和 second成员:
namespace std
{
template<typename T1,typename T2>
struct pair
{
pair(const T1& x, const T2& y);
template<typename U, typename V>pair(U&& x, V&& y);
template<typename...Args1,typename...Args2>
pair(piecewise_construct_t, tuple<Args1...>first_args, tuple<Args2...>second_args);
};
}
前两个函数提供的是一般行为:传递一个实参给 first,另一个实参给 second ,并且涵盖对移动语义和隐式类型转换的支持。
第三个构造函数,允许传递两个 tuple的对象,将其元素传递给 first 和 second的构造函数。为了强迫执行这样的行为,你必须传递 std::piecewise_construct作为额外的第一实参。
class Foo
{
public:
Foo(tuple<int, float>)
{
cout << "调用:Foo(tuple<int, float>)" << endl;
}
template<typename...Arge>
Foo(Arge...arge)
{
cout << "调用:template<typename...Arge> Foo(Arge...arge)" << endl;
}
};
int main()
{
int a = 42;
tuple<int, float> t(1, 2.22);
pair<int, Foo> p1(a, t);
pair<int, Foo>p2(piecewise_construct, make_tuple(a), t);
return0;
}
只有当std::piecewise_construct被当作第一实参,class Foo才会被迫使用那个“接受tuple的元素而不是接受 tuple这个整体“的构造函数。如果提供 Foo::Foo(int,float)构造函数的话,那么将会调用这个构造函数。
对于带有std::piecewise_construct参数的构造函数,只有当两个实参都是 tuple 是才会被导致这个行为。
便携函数 make_pair()
Template 函数 make_pair()使你无须写出类型就能生成一个 pair对象。例如:
std::pair<int, string>(42, "0");可以写成下面示例:
std::make_pair(42, "0");自C++11起, class pair需要应付 移动语义,所以其对 make_pair()的声明如下:
namespace std {
template<template T1,template T2>
pair<V1, V2>make_pair(T1&& x, T2&& y);
}
对于这样的模板,其中返回值的细节和它们的类型V1,V2,取决于x和y的类型。且如果make_pair()可使用移动语义,那么优先使用移动语义,否则使用复制语义。
相关文章:
C++ 11 pair
class pair 可将两个 value视为一个单元。C标准库内多处用到了这个 class 。尤其是容器 map、multimap、unordered_map和 unordered_multimap就是使用 pair 来管理其以 key/value pair形式存在的元素。任何函数如果需要返回两个 value,也需要用到 pair,例…...
反向传播与随机梯度下降
反向传播实际上就是在算各个阶段梯度,每层的传入实际是之前各层根据链式法则梯度相乘的结果。反向传播最初传入的Δout是1,Δ通常表示很少量的意思,Δout1的时候这样在反向传播的时候算出来的dw和dx刚好就是当前梯度。深度神经网络中每层都会…...
一个conda引起的CPU异常
03/11/2023 登陆访问用户CPU异常 错误描述 早上向往常一样打开机器,突然感觉CPU有点"乱飙",因为是个人机器,没有别人使用,所以感觉有点问题。 排错流程 首先查看各个进程的资源占用情况 top # 按住P,以CPU的…...
java Date 和 Calendar类 万字详解(通俗易懂)
Date类介绍及使用关于SimpleDateFormat类Calendar类介绍及使用LocalDateTime类介绍及使用关于DateTimeFormatter类一、前言本节内容是我们《API-常用类》专题的第五小节了。本节内容主要讲Date 类 和 Calendar 类,内容包括但不限于Date类简介,Date类使用…...
扩展欧几里得算法及其应用
前言 由于数论的板子真的很抽象,也很难背,所以特此记录扩展欧几里得算法的板子和它的用途 本篇文章只涉及应用,不涉及证明,如需理解证明还请各位移步其他优秀的讲解! 扩展欧几里得算法 先粘一下板子的代码 typedef lo…...
JAVA练习75-全排列
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 3月11日练习内容 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目-…...
Linux下Docker安装mysql-超详细步骤
安装Docker Engine官方参考文档:https://docs.docker.com/engine/install/centos/若之前有安装docker,需要先卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \d…...
弹性存储-对象存储OSS部分
对象存储介绍 对象存储(object storage service,简称oss),具备与平台无关的rest api接口,可提供99.9999999999%(12个9)的数据持久性和99.995%的数据可用性。 OSS优势 功能介绍 存储空间bucke…...
强推!30个遥感数据下载网站整理分享
1、中国遥感数据共享网(http://rs.ceode.ac.cn/)国内存档周期最长的数据网站,对Landsat数据免费共享,也可订购国外商业卫星数据。注册账号,通过审核就可直接下载。2、中国资源卫星应用中心(https://data.cr…...
进程系统调用
进程系统调用 文章目录进程系统调用fork()进程创建:fock()fork函数fork用法僵尸进程孤儿进程vfork函数vfork与fork区别exec函数族exec函数族-何时使用?exec函数族语法exec函数族使用区别exit和_exit_exit和exit的区别wait和waitpidfork() 进程创建&…...
dubbo进阶——服务导出
服务导出 在这里记录一下对" Dubbo 导出服务的过程"的研究。 触发时机 public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEv…...
【竞品分析】如何撰写竞品分析?竞品分析的基本结构?以及优秀的竞品分析案例
文章目录一、撰写竞品分析的意义二、撰写的节点三、竞品分析内容的基本结构四、总结本文对视频 如何撰写竞品分析(demo)进行了总结。一、撰写竞品分析的意义 竞品分析是指对现有的或潜在的竞争产品的优势和劣势进行评价。现在被广泛应用于互联网产品的…...
海思ubootsd卡协议
在start_armboot()函数中调用mmc_initialize(0)初始化mmc;最终调用到int hi_mci_initialize(unsigned int dev_num)函数;内容如下:static int hi_mci_initialize(unsigned int dev_num) {struct mmc *mmc NULL;static struct himci_host *host;unsigned int regval;unsigned l…...
nuxt3使用总结
目录 背景 安装 项目配置 路由 Tailwindcss引入 全局样式配置 css预处理器 安装 Tailwindcss 项目的配置 部署上线 seo优化 背景 新入职了一家公司,刚进入公司第一个需求就是先做一个公司的官网,需要使用vue写,作为祖师爷的粉丝…...
指向函数的指针详解,以及如何使用指向函数的指针变量做函数参数
指向函数的指针作为函数参数,是 C 语言实际应用中的一个比较深入的部分。 目录 一、什么是函数的指针 二、用函数指着变量调用函数 2.1举例说明 三、怎样定义和使用指向函数的指针变量 3.1定义指向函数的指针变量 3.2指向函数的指针变量详解 3.3通过指针变量…...
Spring——spring整合JUnit
JUnit定义: Junit测试是程序员测试,即所谓 白盒测试 ,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。 Junit是一套框架,继承TestCase类,就可以用Junit进行…...
保障信息安全:使用PyZbar库识别二维码图片可以快速获取二维码中的信息,保障信息安全。
目录 简介: 源代码: 源代码说明: 效果如下所示: 简介: 不用摄像头识别二维码可以应用在以下场景: 批量处理二维码图片:可以在服务器上使用PyZbar等库来批量处理二维码图片,例如读…...
从LeNet到ResNet:深入探索卷积神经网络
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
计算机组成原理_总线标准
计算机组成原理总目录总线标准 总线标准是系统与各模块、模块与模块之间的一个互连的标准,就像我们用汉语来相互交流一样。 1. 系统总线 ISA总线的扩展插槽,其颜色一般为黑色,比PCI接口插槽要长些,位于主板的最下端。 可插接显卡&…...
蓝桥杯C/C++VIP试题每日一练之芯片测试
💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…...
如何高效提取Unity中的Live2D模型:专业开发者的实用指南
如何高效提取Unity中的Live2D模型:专业开发者的实用指南 【免费下载链接】UnityLive2DExtractor Unity Live2D Cubism 3 Extractor 项目地址: https://gitcode.com/gh_mirrors/un/UnityLive2DExtractor UnityLive2DExtractor是一款专为Unity开发者设计的强大…...
2026年AI数字人功能大盘点:新手必看的7大核心功能
2026年AI数字人功能大盘点:新手必看的7大核心功能 AI数字人到底有哪些功能?AI数字人有哪些功能?小白也能用的AI数字人功能有哪些?最近越来越多的朋友问我这些问题。今天我们就来一文搞懂AI数字人的核心功能。一、形象克隆…...
深度评测:五款主流AI框架在推理场景下的性能对比
1. 引言:从模型训练到推理部署的挑战随着深度学习模型在NLP、CV等领域取得突破性进展,AI能力的核心瓶颈正从“如何训练”转向“如何高效部署并推理”。对于开发者和基础设施工程师而言,在资源受限的边缘设备(如手机、IoTÿ…...
英文论文降AI全靠同义词替换?错!3款“结构级”辅助工具实测,稳过Turnitin
这两天帮朋友看海外项目的英文稿,发现大家全卡在了 Turnitin 的高疑似度上。熬夜手敲的长篇英文,一查AI率高的吓人,直接让人血压飙升。 为了提升文本表达的原创度,很多人疯狂寻找免费降ai率的方法。其实现在的海外检测早就进化了&…...
TuxGuitar终极指南:免费开源吉他谱编辑软件的完整入门教程
TuxGuitar终极指南:免费开源吉他谱编辑软件的完整入门教程 【免费下载链接】tuxguitar Open source guitar tablature editor 项目地址: https://gitcode.com/gh_mirrors/tu/tuxguitar TuxGuitar是一款功能强大的免费开源吉他谱编辑软件,专为吉他…...
Windows 11 LTSC系统恢复微软商店:3分钟快速安装完整指南
Windows 11 LTSC系统恢复微软商店:3分钟快速安装完整指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否在使用Windows 11 LTSC版本…...
Win11系统下Anaconda3-2022.10保姆级安装与避坑指南(附不勾选PATH的详细原因)
Win11系统下Anaconda3-2022.10深度安装指南与关键配置解析 在数据科学和机器学习领域,Anaconda已经成为Python环境管理的标准工具之一。对于Windows 11用户来说,正确安装和配置Anaconda是开启数据分析之旅的第一步。本文将深入探讨Anaconda3-2022.10版本…...
Kubernetes部署MeiliSearch:从概念到生产级实践指南
1. 项目概述:当MeiliSearch遇见Kubernetes 如果你正在寻找一个轻量级、高性能的开源搜索引擎,并且你的应用恰好运行在Kubernetes上,那么 meilisearch/meilisearch-kubernetes 这个项目就是你一直在等的“官方说明书”。简单来说,…...
3分钟学会在Windows电脑安装安卓应用:APK Installer完全指南
3分钟学会在Windows电脑安装安卓应用:APK Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接运行安卓应用而烦恼…...
黑群晖/白群晖通用!Docker部署DDNS-Go搞定腾讯云域名解析(保姆级避坑指南)
群晖与腾讯云域名解析终极方案:Docker化DDNS-Go实战指南 当你在群晖NAS上尝试配置腾讯云DDNS服务时,是否遇到过"认证失败"的困扰?这个问题尤其困扰黑群晖用户,但即便是白群晖用户也难免遭遇兼容性难题。本文将带你探索…...
