前言
你是否因为把 pair<int,pair<int,int>>
当作三元组来用而苦恼于代码中充斥着难看的 .second.first
?或是为 tuple<int,int,int>
的奇妙语法 get<3>(x)
感到迷惑?我们需要一个封装完整的简单易用的三元组模板类,triplet.h
由此诞生。
(虽然它的本体是 struct
而不是 class
,但是 pair
也是 struct
却还是叫模板类,所以姑且把 triplet
也称作模板类吧。)
本文在以下平台同步发送:博客园、CSDN
获取方式
-
代码仓库地址:https://github.com/Jerrycyx/triplet
-
最新文件下载:https://github.com/Jerrycyx/triplet/releases/latest
请跟随上述链接中的指示选择对应的文件下载(或者直接复制)。
如无法正常访问 Github,请自行使用 Watt-Toolkit 等软件连接。
如果帮助到了你,也请给本文点个赞或为项目点个 Star 支持。
引入代码
引入方法#1:作为头文件引入
将头文件 triplet.h
和代码放在同一目录下,然后再代码开头加入 #include "triplet.h"
即可(引入第三方库只能使用引号 ""
)。
或者您也可以放在别的目录下,然后用文件绝对路径或者相对路径格式访问。关于绝对路径和相对路径,请自行搜索语法。
引入方法#2:作为代码的一部分
OIer 们提交代码只能提交一个文件,所以您也可以选择直接将 triplet.min.h
中除了前两行和最后一行(这是头文件相关宏定义)的内容复制下来,粘贴到您的代码相应位置即可正常使用。
使用方法
本三元组模板类采用和 C++ 自带 pair
一样的封装方法,所以使用方法也和 pair
类似。
省流:多了一个 .third
元素,其它构造、初始化、比较等和 pair
一模一样。
创建与初始化
triplet<int,int,int> t; //创建一个三元组t
triplet<int,int,int> t(1,2,3); //创建三元组t,通过构造函数将内部元素初始化为{1,2,3}
triplet<int,int,int> t={1,2,3}; //同上,不过这次是使用列表初始化
如果创建三元组的时候未初始化内部元素,三元组会自动调用元素类型的构造函数(如果有的话)进行初始化。
当然,类似于 make_pair
,头文件中也自带了类似的函数:
make_triplet(x,y,z); //函数返回三元组{x,y,z}
调用内部元素
- 第一个元素:
t.first
- 第二个元素:
t.second
- 第三个元素:
t.third
是不是很好记呢?
比较运算符
triplet
重载了六个比较运算符,分别是 ==
、!=
、<
、>
、<=
、>=
。
类似于 pair
的比较方式,这六个运算符的比较规则如下:
==
:first
、second
、third
这三个元素均相等;!=
:三个元素至少有一个不相等;<
:以first
为第一关键字,second
为第二关键字,third
为第三关键字比较大小(即优先比较first
的大小,如果相等就比较second
,再相等就比较third
);>
:同上;<=
:不大于(x<=y
等价于!(x>y)
);>=
:不小于。
简而言之就是依次比较 first
、second
、third
。
以上比较运算符仅要求内部元素有 <
和 ==
运算符,且满足偏序关系(即 x<y
和 y<x
不能同时成立)。
版权声明
triplet.h
采用 MPL-2.0 (Mozilla Public License 2.0) 开源协议。
- 在使用或分发被授权软件时,必须保留原始版权、许可和免责声明,并在修改后的代码中包含相应的声明。
- 如果对被授权软件进行修改,并分发修改后的代码,必须以源代码形式提供修改后的代码,并遵守 MPL-2.0 许可证的条款。
- 在分发被授权软件时,不能移除或修改原始代码中的版权和许可声明。
——来源