STL源码剖析——stl_pair.h学习
2014-09-24 18:59
260 查看
前言
pair在关联容器中经常被使用,它提供了两个成员变量first和second,由于pair是一个struct,所以其成员变量的属性是public。在pairstruct中提供了构造函数和拷贝构造函数,同时提供了两个最基本的操作operator==和operator<重载,其他的操作符重载都是基于前面两种的变形。本文源码来自SGI
STL中的<stl_pair.h>文件。
pair源码剖析
#ifndef __SGI_STL_INTERNAL_PAIR_H #define __SGI_STL_INTERNAL_PAIR_H __STL_BEGIN_NAMESPACE /* pair在关联容器中使用很广泛,它是STL的模板类型,可以存储两个成员变量 pair采用的是struct结构,struct的成员默认属性是public */ template <class _T1, class _T2> struct pair { typedef _T1 first_type; typedef _T2 second_type; //pair的两个成员变量,其属性是public _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) {} //注意:用pair初始化另一个pair时,只能通过拷贝构造函数进行,不能通过赋值进行 //因为这里没有提供operator=操作符的重载 #endif }; //operator==操作符重载 //两个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; } //operator<操作符重载 //比较两个pair时,以第一个成员变量first为主,若第一个成员变量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); } #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER //下面的操作符重载都是基于上面operator<和operator==操作符的. //operator!=,operator>,operator<=,operator>=操作符的重载 template <class _T1, class _T2> inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { return !(__x == __y); } template <class _T1, class _T2> inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { return __y < __x; } template <class _T1, class _T2> inline bool operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { return !(__y < __x); } template <class _T1, class _T2> inline bool operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { return !(__x < __y); } #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */ //根据两个数值,构造一个pair template <class _T1, class _T2> inline pair<_T1, _T2> make_pair(const _T1& __x, const _T2& __y) { return pair<_T1, _T2>(__x, __y); } __STL_END_NAMESPACE #endif /* __SGI_STL_INTERNAL_PAIR_H */ // Local Variables: // mode:C++ // End:
参考资料:
《STL源码剖析》侯捷
《STL源码剖析-- stl_pair.h》
相关文章推荐
- STL源码剖析-学习之路(一)STL组件
- STL源码剖析学习十一:hashtable
- STL源码剖析学习三:迭代器与traits
- STL源码剖析学习十九:配接器
- STL中map, list, and pair的学习笔记
- STL源码剖析学习之基本算法
- STL源码剖析学习之容器
- STL学习笔记 ---- 工具类pair
- C++ Standard Stl -- SGI STL源码学习笔记(06) stl_vector 与 一些问题的细化 2 push_back函数剖析
- STL源码剖析学习十九:配接器
- STL源码剖析学习之数值算法
- STL源码剖析学习四:vector
- STL源码剖析学习十:红黑树的实现
- STL源码剖析学习九:树
- C++ Standard Stl -- SGI STL源码学习笔记(07) stl_vector 与 一些问题的细化 3 resize函数剖析
- STL源码剖析学习二:空间配置器(allocator)
- STL源码剖析学习五:list
- STL源码剖析学习十二:算法之数值算法
- STL源码剖析学习之increment、decrement、dereference实现源码
- STL源码剖析学习十七:算法之其他算法