【試着本身寫一個STL 】Knife_STL —— pair.h

#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中的操做符<<重載 */
相關文章
相關標籤/搜索