队组
class Pair 可以将两个值视作一个单元。C++标准库库内多处使用了这个Class,尤其是容器map和multimap,就是使用了Pairs来管理键值对,任何函数返回两个值也需要pair.1
2
3
4
5
6
7
8
9
10
11
12
13
14namespace std
{
template<class T1,class T2>
struct Pair{
typedef T1 first_type;
typedef T2 second_type;
pair()
:first(T1(),second(T2))
{}
pair(const pair<U,V>&p)
:first (p.first),second(p.second){}
}
};
注意,pair被定义为struct,而不是class,这样所有成员都是public,因此可以直接存储pair的个别值。1
std:pair<int,float>p;
上述defalut构造函数生成一个pair时,以int()和float()来初始化p,这两个构造函数为0值;
如果pair对象被复制,调用的是由系统隐式生成的的哪个copy构造函数,例如:1
2
3
4
5
6
7void f(std::pair<int,const char*>);
void f(std::pair<const int,std::string>);
void foo{
std::pair<int,const char*>p(42,"hello");
f(p);
g(p);
}
pair之间的比较
为了比较两个pair对象,C++标准程序库提供了大家惯用的操作符。如果两个pair对象内的所有元素相等,这两个pair对象就被视为相等。1
2
3
4
5
6namespace std{
template<class T ,class T2>
bool operator==(const pair<T,T2>&X,const pair <T,T2>&y){
return x.first==y.first&&x.second==y.second;
}
}
当两个pairs相互比较时,第一元素具有较高的优先级,所以如果两个pairs的第一元素不相等,其比较结果就称为整个比较行为的结果。如果第一元素相等,才继续比较第二元素,并把比较结果当作整体比较结果。1
2
3
4
5
6
7namespace 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);
}
}
其他的比较操作符,也差不多相似。