#ifndef KNIFE_PAIR_H #define KNIFE_PAIR_H #include "config.h" #include <ostream> _STL_NAMESPACE_BEGIN template <typename A_Type, typename B_Type> struct pair { typedef A_Type first_type; typedef B_Type second_type; A_Type first; B_Type second; // 這個在GP編程中會使用的特殊方法能夠好好學學 pair() : first(A_Type()), second(B_Type()) {} pair(const A_Type& a, const B_Type& b) : first(a), second(b) {} // 這個是保證轉型狀況下的正常執行,如mk_pair(3.4, 4.5)會自動獲得 // pair<double, double>的類型,但咱們若是須要的是float類型 // 那麼咱們必須得用這個函數進行轉型 template <typename C_Type, typename D_Type> pair(const pair<C_Type, D_Type>& p) : first(p.first), second(p.second) {} }; template <typename A_Type, typename B_Type> inline bool operator==(const pair<A_Type, B_Type>& pair1, const pair<A_Type, B_Type>& pair2) { return pair1.first == pair2.first && pair1.second == pair2.second; } // 這是很重要的,pair在作基本operation時,應該要求他的成員也只作相應的operation // 在咱們之後設計類時能夠作借鑑 template <typename A_Type, typename B_Type> inline bool operator<(const pair<A_Type, B_Type>& pair1, const pair<A_Type, B_Type>& pair2) { return pair1.first < pair2.first || (!(pair2.first < pair1.first) && pair1.second < pair2.second); } template <typename A_Type, typename B_Type> inline std::ostream& operator<<(std::ostream& os, const pair<A_Type, B_Type>& p) { os << " Pair<" << p.first << ", " << p.second << "> "; return os; } template <typename A_Type, typename B_Type> inline pair<A_Type, B_Type> mk_pair(const A_Type& a, const B_Type& b) { return pair<A_Type, B_Type>(a, b); } _STL_NAMESPACE_END #endif /* 對這個類我增長了輸出到console中的操做符<<重載 */