SGISTL源码阅读二十一 piar的实现
前言
在之前set和map的学习中,我们已经见过了pair,它的作用就是把一对值封装成一个。而且这一对值可以是不同数据类型的,对于set和map来说是绝佳的选择。
深入源码
pair的定义及拷贝构造函数
template <class T1, class T2>
struct pair {
//声明别名
typedef T1 first_type;
typedef T2 second_type;
//pair内部维护了两个值
T1 first;
T2 second;
//构造函数
pair() : first(T1()), second(T2()) {}
pair(const T1& a, const T2& b) : first(a), second(b) {}
#ifdef __STL_MEMBER_TEMPLATES
//pair的拷贝构造函数
template <class U1, class U2>
pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
#endif
};
我们可以看到pair的实现是非常简单的,就是一个模板结构体,内部维护了两个值,可以是两个不同类型的值。map在使用它的时候将第一个值作为键值,第二个值作为实值。
操作符重载和pair提供的接口
//重载==
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;
}
//重载<
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);
}
//创建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);
}
###总结
pair的代码很短,也非常好懂。

本文深入探讨了SGISTL库中pair的实现细节,包括其结构定义、拷贝构造函数、操作符重载以及make_pair函数的使用。通过源码解析,揭示了pair如何将两不同类型的数据封装在一起,为set和map提供了关键的支持。
1165

被折叠的 条评论
为什么被折叠?



