#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中的操作符<<重载 */