STL源码剖析——stl_pair.h学习

青旅半醒 2022-08-12 11:59 284阅读 0赞

前言

pair在关联容器中经常被使用,它提供了两个成员变量first和second,由于pair是一个struct,所以其成员变量的属性是public。在pair struct中提供了构造函数和拷贝构造函数,同时提供了两个最基本的操作operator==和operator<重载,其他的操作符重载都是基于前面两种的变形。本文源码来自SGI STL中的文件。

pair源码剖析

  1. #ifndef __SGI_STL_INTERNAL_PAIR_H
  2. #define __SGI_STL_INTERNAL_PAIR_H
  3. __STL_BEGIN_NAMESPACE
  4. /*
  5. pair在关联容器中使用很广泛,它是STL的模板类型,可以存储两个成员变量
  6. pair采用的是struct结构,struct的成员默认属性是public
  7. */
  8. template <class _T1, class _T2>
  9. struct pair {
  10. typedef _T1 first_type;
  11. typedef _T2 second_type;
  12. //pair的两个成员变量,其属性是public
  13. _T1 first;
  14. _T2 second;
  15. //以下是构造函数
  16. pair() : first(_T1()), second(_T2()) {}
  17. pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
  18. #ifdef __STL_MEMBER_TEMPLATES
  19. //兼容性的拷贝构造函数
  20. //兼容性是指两个pair的类型可以不同,但是必须可以转换
  21. template <class _U1, class _U2>
  22. pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}
  23. //注意:用pair初始化另一个pair时,只能通过拷贝构造函数进行,不能通过赋值进行
  24. //因为这里没有提供operator=操作符的重载
  25. #endif
  26. };
  27. //operator==操作符重载
  28. //两个pair相等时,意味着两个成员变量都对应相等
  29. template <class _T1, class _T2>
  30. inline bool operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  31. {
  32. return __x.first == __y.first && __x.second == __y.second;
  33. }
  34. //operator<操作符重载
  35. //比较两个pair时,以第一个成员变量first为主,若第一个成员变量first不能判断表达式的大小
  36. //则对其第二个成员变量second进行比较
  37. template <class _T1, class _T2>
  38. inline bool operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  39. {
  40. return __x.first < __y.first ||
  41. (!(__y.first < __x.first) && __x.second < __y.second);
  42. }
  43. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  44. //下面的操作符重载都是基于上面operator<和operator==操作符的.
  45. //operator!=,operator>,operator<=,operator>=操作符的重载
  46. template <class _T1, class _T2>
  47. inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
  48. return !(__x == __y);
  49. }
  50. template <class _T1, class _T2>
  51. inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
  52. return __y < __x;
  53. }
  54. template <class _T1, class _T2>
  55. inline bool operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
  56. return !(__y < __x);
  57. }
  58. template <class _T1, class _T2>
  59. inline bool operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
  60. return !(__x < __y);
  61. }
  62. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  63. //根据两个数值,构造一个pair
  64. template <class _T1, class _T2>
  65. inline pair<_T1, _T2> make_pair(const _T1& __x, const _T2& __y)
  66. {
  67. return pair<_T1, _T2>(__x, __y);
  68. }
  69. __STL_END_NAMESPACE
  70. #endif /* __SGI_STL_INTERNAL_PAIR_H */
  71. // Local Variables:
  72. // mode:C++
  73. // End:

参考资料:

《STL源码剖析》侯捷

《STL源码剖析— stl_pair.h》

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 STL剖析】Sort算法

    前言:sort算法必须拿出来单独将,因为它是STL所有算法中最复杂最庞大的一个,就像我肯定会把copy算法单独列出来一样,这两个算法太重要了。 提示:STL算法特点是,前两个

    相关 STL剖析--vector

    vector容器概述       vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变

    相关 STL剖析1

    stl概论 stl以抽象概念为主题而非以实际类为主的结构,形成了一个严谨的接口标准。在此接口之下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以所谓配接器互相配接,或