SGISTL源码探究-pair的实现

前言

本小节将对pair进行源码分析,它经常用于map的实现中,而我们下一节就会分析map的源码,所以有必要在这一小节中,先把pair分析了。
pair的作用就是将两个数据合成一个,而这两个数据可以是不同的类型,这就非常符合key-value这种键值对形式的存储了,接下来我们就进入到它的源码之中。

pair的实现

pair的实现代码很短,100行不到,但是对map的实现确实提供了非常大的便利。它提供的操作也很简单,除了重载的操作符之外,提供的唯一接口就是make_pair了,用过map容器的应该都不陌生。

template <class T1, class T2>
//T1代表第一个元素的类型,T2代表第二个元素的类型
struct pair {
  typedef T1 first_type;
  typedef T2 second_type;

  //first和second成员
  T1 first;
  T2 second;
  //构造函数,使用初始化列表构造first还有second成员
  pair() : first(T1()), second(T2()) {}
  //构造函数
  pair(const T1& a, const T2& b) : first(a), second(b) {}

  //拷贝构造函数
#ifdef __STL_MEMBER_TEMPLATES
  template <class U1, class U2>
  pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
#endif
};

//重载==操作符,需要first和second都相等,才返回true
template <class T1, class T2>
inline bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) {
  return x.first == y.first && x.second == y.second;
}

//重载<操作符,要求x.first<y.first或者在前者相同的情况下,比较second
template <class T1, class T2>
inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y) {
  return x.first < y.first || (!(y.first < x.first) && x.second < y.second);
}

//make_pair函数,内部其实就是构造了一个pair,然后返回
template <class T1, class T2>
inline pair<T1, T2> make_pair(const T1& x, const T2& y) {
  return pair<T1, T2>(x, y);
}

例子

#include <iostream>
#include <map>
using namespace std;
int main()
{
    pair<int, string> pa1(3, "asdas");
    pa1.first = 4;
    cout << pa1.first << " " << pa1.second << endl;
    pair<int, string> pa2(4, "asdab");
    //先比较first,如果first相等,才比较second
    cout << (pa1 < pa2) << endl;
    pa1.second = "asdaa";
    cout << (pa1 < pa2) << endl;
    return 0;

}

小结

本小节针对pair的实现进行了分析,它本身的实现很简单,但是对于map来说是必不可少的,在下一小节中,我们可以看到map中对它大量的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值