三元组模板类——triplet.h

news/2025/2/19 9:27:55/文章来源:https://www.cnblogs.com/jerrycyx/p/18714687

前言

你是否因为把 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 的比较方式,这六个运算符的比较规则如下:

  • ==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 许可证的条款。
  • 在分发被授权软件时,不能移除或修改原始代码中的版权和许可声明。

——来源

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第四期书生大模型实战营】L0G3000 Git 基础知识

闯关任务 任务1: 破冰活动:自我介绍 每位参与者提交一份自我介绍。 提交地址:https://github.com/InternLM/Tutorial 的 class 分支~命名格式为 <id>.md,其中 <id> 是您的报名问卷UID。 文件路径应为 ./icamp4/。 【大家可以叫我】内容可以是 GitHub 昵称、微信…

读算法简史:从美索不达米亚到人工智能时代15读后总结与感想兼导读

读算法简史:从美索不达米亚到人工智能时代15读后总结与感想兼导读1. 基本信息 算法简史:从美索不达米亚到人工智能时代克里斯布利克利 著中信出版集团股份有限公司,2024年9月出版1.1. 读薄率 书籍总字数18.6万字,笔记总字数51653字。 读薄率51653186000≈27.77% 1.2. 读厚方…

公众号[1]-「爱数葡萄」v0.6版本发布

「爱数葡萄」是一款基于yolov5的机器视觉软件,主要功能是对葡萄果粒进行计数,目的是助力农业现代化,提高葡萄果园管理效率。「爱数葡萄」v0.6版本发布 软件简介 「爱数葡萄」是一款基于yolov5的机器视觉软件,主要功能是对葡萄果粒进行计数,目的是助力农业现代化,提高葡萄果园管…

公众号[2]-github项目分享-slambook2.rs项目

宝子们,今天给大家安利一个超酷的项目——slambook2的Rust🔥重构版!这可不是普通的代码重构,而是用Rust语言重新实现的SLAM(同时定位与建图)算法,简直太安全了!(≧▽≦)这个项目提供了超详细的使用说明和开发笔记哦!✨ 宝子们可以用Wasmer运行时直接运行预构建的Wasm…

[2025.2.10 JavaWeb学习]Ajax/Axios Vue-cli Nginx

Ajax 概念Asynchronous JavaScript And XML,异步的JS和XML 作用:数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术Axios 基本概念对原生的Ajax进行了封装 基本使用:前端…

【枚举】遍历矩阵对角线的方法

矩阵为\(n*m\)型,\(n\)为行,\(m\)为列,\(n+m-1\)为对角线数量//撇对角线for (int i = 0; i < n + m - 1; i++){for (int j = max(0, i - m + 1); j <= min(i, n - 1); j++){cout << g[j][i - j] << ;}cout << \n;}//捺对角线for (int i = 1 - m; i…

Typora使用指南

Typora 使用方法 快捷键 标题 +空格=一级标题 +空格=二级标题 +空格=三级标题 最多支持6级 字体 粗体:字体两边+两个** 斜体:字体两边+一个* 斜体加粗:字体两边+三个*** 划横线删除:字体两边+两个~~ 引用:文本前>加 空格 注意引用只能在首字符。例如只能在首字符进行引…

图解支付系统订单号设计与最佳实践

本文主要讲清楚支付系统订单号(或业务ID)各种设计方案对比,各子域的订单号(或业务ID)为什么要统一规范,以及最佳实践。最后还会简单分析微信支付和支付宝的对客订单号的组成差异。 假如你也好奇为什么有了数据库自增ID外还需要业务ID,或者想了解如何在业务ID中编织进业务…

Windows 网络存储ISCSI

本文介绍网络存储ISCSI的主要知识点以及如何通过代码控制挂载。 Windows网络存储有很多协议,我目前学习、稍微有了解的是FTP、SMB、ISCSI,FTP、SMB类似可以用来添加共享文件夹,或者添加映射网络驱动器:我使用FTP都是先建个映射,再将内部的文件夹固定到快速访问。平时使用效…

2022-03-17-hello-world

📌 Thinking No emotion; no journal; less platitude I have a habit of writing diaries in high school, to decrease the pressure and anxiety. So blog inherit it. As time going by, I realize I have to make a review of my life, in every single post, and its r…

2023-01-01-one-wisdom

2023 新年伊始,整理 2022 的陳年筆記時發現有很多不知名,但是又捨不得丟棄的句子,想着乾脆把他們做成引用得了。連着建倉庫,設計頁面,寫腳本一套下來也沒花太多時間,一個簡單的靜態自動部署的網站就建好了: One[1].Tech stackJekyll Github ActionHighlightsEvery single…

小米 R3G 路由器(Pandavan)实现网络打印机功能

通过小米 R3G 路由器的 USB 3.0 接口和 Pandavan 固件,轻松将没有网络打印功能的打印机接入网络。本文详细讲解如何通过无线桥接、设置内外网、端口映射和启用打印服务,让 PC 通过 TCP/IP 方式添加打印机,实现多设备共享打印,解决传统共享打印的高耗电问题。小米 R3G 路由器…