标准模板库pair的理解
-通用库的设计原则 litzhang
标准库提供的一个数对pair,可以将两个数当作一个单元。容器map和multimap,就是使用pair来管理key/value的成对元素。pair定义在<utility>中,是一个结构,这意味着pair的所有成员都是public,可以方便的存储成员变量。
问:为什么要是public,而不是私有,加上一个存取器?
答:c++设计准则:速度和使用便利。
pair提供三个构造函数:
1,无参的构造函数(A处),将成员变量初始化,调用成员变量的无参构造函数。C++的基本类型会构造为0。
2,两个参数的构造函数(B处),分别初始化成员first和second。
3,拷贝构造函数(C处),分别调用各自的拷贝构造函数。
问:为什么要提供上述构造函数?
答:在分别在下列情况下使用。
//例:
#include <iostream>
#include <utility>
#include <string>
int main(int argc, char* argv[])
{
using namespace std;
pair<int,char*> pair_a;//无参的构造函数
pair<int,char*> pair_t(2,"abc");//两个参数的构造函数
pair<int,string> pair_s = pair_t;//拷贝构造函数,隐式类型转换.
pair_t.first = 1;
pair_t.second = "litzhang";
cout<<"pair_t.first:"<<pair_t.first<<endl;
cout<<"pair_t.second:"<<pair_t.second<<endl;
cout<<"pair_s.first:"<<pair_s.first<<endl;
cout<<"pair_s.second:"<<pair_s.second<<endl;
return 0;
}
问:结构可以用列表的形式初始化,pair可以吗?
不可以,因为已经提供了构造函数,将会调用构造函数,所以不能用列表的形式初始化,否则编译错误。
pair也对==,!=,<,>,<=,>=共六个操作符进行重载,来进行pair对象的比较,如果pair对象的两个成员都相等,则就相等。
对于大小的比较也是一样,调用成员的优先级进行比较,第一个元素有较高的优先级,
只要实现"=="和"<",其他都可以用这两个来实现。
其中"!="用"=="来实现,">",">=","<="用"<"来实现.
这些都是设计准则:速度和使用便利的体现。
此外还提供函数make_pair(),不须写出类型,即可的到一个pair对象。
下面是vc6.0中的标准库pair,其他平台可能稍有不同。
template<class _T1, class _T2> struct pair {
typedef _T1 first_type;
typedef _T2 second_type;
pair()//A
: first(_T1()), second(_T2()) {}
pair(const _T1& _V1, const _T2& _V2)//B
: first(_V1), second(_V2) {}
template<class U, class V> pair(const pair<U, V> &p)//C
: first(p.first), second(p.second) {}
_T1 first;
_T2 second;
};