【试着自己写一个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中的操作符<<重载 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值