pair(对组)

struct pair可以将两个值视为一个单元,c++标准程序库内多处使用了这个struct,尤其在map与multimap中就是使用pair来管理其键值/实值(key/value)的成对元素,任何函数返回两个值也需要pair,pair定义于<utility>中

name std{
	template<class T1, class T2>
	struct pair{
		typedef T1 first_type ;
		typedef T2 second_type ;
		
		T1 first ;
		T2 second ;
		
		pair()
			:first(T1()), second(T2()){}
		
		pair(const T1& a, const T2& b)
			:first(a), second(b) {}
		
		template<class U, class V>
		pair(const pair<U, V>& p)
			:first(p.first), second(p.second){}
	};
	
	template <class T1, class T2>
	bool operator== (const pair<T1, T2>&, const pair<T1, T2>&) ;
	
	template <class T1, class T2>
	bool operator< (const pair<T1, T2>&, const pair<T1, T2>&) ;
	
	template <class T1, class T2>
	pair<T1, T2> make_pair(const T1&, const T2&) ;
.....
};
pair是作为struct而不是class的类模板,所以其成员都是public可以直接存取,其中default函数调用各自类型的default函数进行初始化

std::pair<int, float> p;就是以int(),float()来初始化p,这两个构造函数都是返回0值。

这里之所以使用template形式的copy构造函数,是因为构造过程中可能需要隐式型别的转换,如果pair对象被复制,调用的是由系统隐式生成的copy构造函数:

void f(std::pair<int, const char*>) ;

void g(std::pair<const int, std::string>) ;

void foo{
	std::pair<int, const char*> p(42, "hello") ;
	f(p) ;//calls built-in default copy constructor
	g(p) ;//calls template constructor
}

ps:隐式转换:加入类 A定义一个这样的构造函数A(int ) ; 我们调用的函数的形式是function(A   a),而此时我只传过去一个int参数如function(3),则会发生隐式转换,通过调用A(int)函数生成A类型的队形

pair对象的比较:如果两个pair对象的所有元素都相等,这两个pair对象就被视为相等:

namespace std{
	template<class T1, class T2>
	bool operator== (const pair<T1, T2>& x, const pair<T1, T2>& y)
	{
		return x.first == y.first && x.second == y.second ;		
	}
}
两个pairs互相比较时,第一个元素具有较高的优先级,只有在第一个元素相等时才比较第二个元素

namespace std{
	template <class T1, class T2>
	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) ;	
	}	
}
便捷函数:make_pair()

template函数make_pair()使你无需写出型别,就可以生成一个pair对象:

namespace std{
	template <class T1, class T2>
	pair<T1, T2> make_pair(const T1& x, const T2& Y)
	{
		return pair<T1, T2> (x, y) ;	
	}
}
当生成一个对象时,我们可以这样std::make_pair(42, '@') ;而无需麻烦的写std::pair<int, char>(42, '@')

当有必要对一个接受pair参数的函数楚地值时,此时make_pair()很方便

void f(std::pair<int, const char*>) ;
void g(std::pair<const int, std::string>) ;

void foo{
	f(std::make_pair(42, "hello")) ;
	g(std::make_pair(42, "hello")) ;
}
从例子中可以看出,make_pair()使得”将两个值当做一个pair参数来传递“的动作更加容易,即使两个值的型别并不准确,也能在template构造函数提供的支持下顺利工作,在map和multimap中应用的比较多。

std::pair<int, float>(42, 7.77)

std::make_pair(42, 7.77)

上一个表达式中是作为float的,后一个作为默认的double在重载函数和模板中应用的时候需要注意了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值