zoukankan      html  css  js  c++  java
  • pair

    pair

    #ifndef __SGI_STL_INTERNAL_PAIR_H
    #define __SGI_STL_INTERNAL_PAIR_H
    
    __STL_BEGIN_NAMESPACE
    
    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
    };
    
    __STL_END_NAMESPACE
    
    #endif /* __SGI_STL_INTERNAL_PAIR_H */
    

    操作符

    //@ 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 */
    

    makr_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 在关联容器中经常被使用,它提供了两个成员变量 first 和 second,由于 pair 是一个 struct,所以其成员变量的属性是 public。
    • 在 pair struct 中提供了构造函数和拷贝构造函数,同时提供了两个最基本的操作 operator== 和 operator< 重载,其他的操作符重载都是基于前面两种的变形。
  • 相关阅读:
    UML建模之时序图(Sequence Diagram)
    UML统一建模语UML2和EnterpriseArchitect
    FTP服务器的搭建
    Ubuntu下Apache重启错误:Could not reliably determine解决
    JSP的优势 和劣势 与php的比较
    [置顶] Ajax 初步学习总结
    pv ticketlock解决虚拟环境下的spinlock问题
    Tomcat从零开始(十)Loader
    HDU 4740 The Donkey of Gui Zhou (模拟)
    关于cvScalar的那些事
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/12609078.html
Copyright © 2011-2022 走看看