尽人事,听天命。|

Jerrycyx

园龄:2年9个月粉丝:2关注:1

三元组模板类——triplet.h

前言

你是否因为把 pair<int,pair<int,int>> 当作三元组来用而苦恼于代码中充斥着难看的 .second.first?或是为 tuple<int,int,int> 的奇妙语法 get<3>(x) 感到迷惑?我们需要一个封装完整的简单易用的三元组模板类triplet.h由此诞生。

(虽然它的本体是 struct 而不是 class,但是 pair 也是 struct 却还是叫模板类,所以姑且把 triplet 也称作模板类吧。)

本文在以下平台同步发送:博客园CSDN

获取方式

请跟随上述链接中的指示选择对应的文件下载(或者直接复制)。

如无法正常访问 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 的比较方式,这六个运算符的比较规则如下:

  • ==firstsecondthird 这三个元素均相等;
  • !=:三个元素至少有一个不相等;
  • <:以 first 为第一关键字,second 为第二关键字,third 为第三关键字比较大小(即优先比较 first 的大小,如果相等就比较 second,再相等就比较 third);
  • >:同上;
  • <=:不大于(x<=y 等价于 !(x>y));
  • >=:不小于。

简而言之就是依次比较 firstsecondthird

以上比较运算符仅要求内部元素有 <== 运算符,且满足偏序关系(即 x<yy<x 不能同时成立)。

版权声明

triplet.h 采用 MPL-2.0 (Mozilla Public License 2.0) 开源协议。

  • 在使用或分发被授权软件时,必须保留原始版权、许可和免责声明,并在修改后的代码中包含相应的声明。
  • 如果对被授权软件进行修改,并分发修改后的代码,必须以源代码形式提供修改后的代码,并遵守 MPL-2.0 许可证的条款。
  • 在分发被授权软件时,不能移除或修改原始代码中的版权和许可声明。

——来源

posted @   Jerrycyx  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起