博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++学习笔记之STL标准库(一)utility.h头文件即结构体模板pair
阅读量:5249 次
发布时间:2019-06-14

本文共 3151 字,大约阅读时间需要 10 分钟。

#include <utility>

pair模板类用来将两个对象表示成一个对象。

用途:1)想要函数同时返回两个参数; 2)想要用一个容器存储成对值的元素

pair模板类核心代码:

#ifndef _UTILITY_

#define _UTILITY_
#include <iosfwd>

// 结构体模板pair

template<class _Ty1,class _Ty2> struct pair

 {

 typedef _Ty1 first_type;
 typedef _Ty2 second_type;

//默认构造函数

 pair(): first(_Ty1()), second(_Ty2())

 {
 }

//以特定的值进行初始化,构造函数

 pair(const _Ty1& _Val1, const _Ty2& _Val2)

 : first(_Val1), second(_Val2)
 { 
 }

//拷贝构造函数

 template<class _Other1,class _Other2>

 pair(const pair<_Other1, _Other2>& other)
 : first(other.first), second(other.second)
 {
 }

 _Ty1 first;//成员变量,pair中的第一个值,通过成员访问运算符.来访问

 _Ty2 second; // 成员变量,pair中的第二个值
 };

// pair的模板函数和操作符重载

template<class _Ty1,class _Ty2> inline  //重载==,判断两个pair相等

 bool operator==(const pair<_Ty1, _Ty2>& x,const pair<_Ty1, _Ty2>& y)
 { 
   return (x.first == y.first && x.second == y.second);
 }

template<class _Ty1,class _Ty2> inline //重载 !=,判断两个pair不相等

 bool operator!=(const pair<_Ty1, _Ty2>& x,  const pair<_Ty1, _Ty2>& y)
 { 
   return (!(x == y));
 }

template<class _Ty1,class _Ty2> inline //重载 < ,判断两个pair大小,判断大小时,第一个元素的优先级更高

 bool operator<(const pair<_Ty1, _Ty2>& x,  const pair<_Ty1, _Ty2>& y)
 { 
   return (x.first < y.first ||  !(y.first < x.first) && x.second < y.second);
 }

template<class _Ty1,class _Ty2> inline //重载 > ,判断两个pair大小

 bool operator>(const pair<_Ty1, _Ty2>& x,  const pair<_Ty1, _Ty2>& y)
 { 
   return (y < x);
 }

template<class _Ty1,class _Ty2> inline //重载 <=

 bool operator<=(const pair<_Ty1, _Ty2>& x,  const pair<_Ty1, _Ty2>& y)
 { 
   return (!(y < x));
 }

template<class _Ty1,class _Ty2> inline //重载 >=

 bool operator>=(const pair<_Ty1, _Ty2>& x,  const pair<_Ty1, _Ty2>& y)
 { 
   return (!(x < y));
 }

template<class _Ty1,class _Ty2> inline //make_pair模板函数,常用来生成 pair对象,但注意make_pair的参数中不能有const常量,否则可能会创建失败

 pair<_Ty1, _Ty2> make_pair(_Ty1 _Val1, _Ty2 _Val2)
 { 
   return (pair<_Ty1, _Ty2>(_Val1, _Val2));
 }

#endif 

总结以上代码可发现:

1)pair支持三种构造函数进行初始化

2)pair中的一对值可以是不同的数据类型

3)pair的两个值分别通过pair.first 和 pair.second进行访问

4)常使用make_pair<class T1,class T2>(t1,t2)生成新的pair对象

5)pair支持大小比较,此时class T1与class T2两个类要相同或要支持比较大小

 

拓展:根据pair的格式写一个结构体模板trio<class _Ty1,class _Ty2,class _Ty3>,支持存储任意类型的三个对象

#ifndef _TRIO_

#define _TRIO_

#include <iosfwd>

template <class _Ty1,class _Ty2,class _Ty3> struct trio

{
   typedef _Ty1 first_type;
   typedef _Ty2 second_type;
   typedef _Ty3 third_type;

   _Ty1 first;

   _Ty2 second;
   _Ty3 third;

   //默认构造函数

   trio():first(_Ty1()),second(_Ty2()),third(_Ty3())
   {
   }

  //使用特定值进行初始化

   trio(const _Ty1& x,const _Ty2& y,const _Ty3& z):first(x),second(y),third(z)

   {
   }

  //拷贝构造函数

   template<class _Ty1,class _Ty2,class _Ty3>

   trio(const trio<_Ty1,_Ty2,_Ty3> &other):first(other.first),second(other.second),third(other.third)
   {

   }

};

//操作符==重载

template<class _Ty1,class _Ty2,class _Ty3> inline
bool operator ==(const trio<_Ty1,_Ty2,_Ty3>& x, const trio<_Ty1,_Ty2,_Ty3>& y)
{
  return ((x.first == y.first)&&(x.second == y.second)&&(x.third == y.third));
}

//模板函数,创建trio对象

template<class _Ty1,class _Ty2,class _Ty3> inline

trio<_Ty1,_Ty2,_Ty3> make_trio(const _Ty1& x,const _Ty2& y,const _Ty3& z)
{
  return trio<_Ty1,_Ty2,_Ty3>(x,y,z);
}

#endif

转载于:https://www.cnblogs.com/jason-20160301/p/8687448.html

你可能感兴趣的文章
性能调优攻略
查看>>
给我们的Empty Object加个图标
查看>>
深入理解Java中的String
查看>>
Centos7安装并配置mysql5.6完美教程
查看>>
iOS 锁屏判断
查看>>
NFC身份证识别(二)
查看>>
转载--Typecho install.php 反序列化导致任意代码执行
查看>>
dsoframer组件详细使用(aspx.net)
查看>>
CodeForces 706C Hard problem
查看>>
【VMware vSphere】vSphere Data Protection简介
查看>>
javascript 模拟java 实现继承的5种方式
查看>>
软件工程课程设计团队项目总结与项目报告
查看>>
Min_25 筛 学习笔记
查看>>
微信小程序购物商城系统开发系列-目录结构
查看>>
人际交往能力:远比你想象的重要
查看>>
node起步
查看>>
SharedPreferences详解
查看>>
Agc011_C Squared Graph
查看>>
虚拟机性能监控与故障处理工具
查看>>
Codeforces Round #226 (Div. 2)C. Bear and Prime Numbers
查看>>