标准模板库pair的理解

 
标准模板库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;
 };
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值