STL新手点击:STL新手入门向
pair
STL的<utility
>头文件中描述了一个看上去非常简单的模版类pair,用来表示一个二元组或元素对,并提供了按照字典序对元素对进行大小比较运算符模版函数。
发现pair并没有单独行动的典型用法,正常都是配合map来使用(即把pair这个元素插入到map这个容器里面),以简单的理解为如下:map可以当做一个容器(装载具有一定格式的数据);pair可以理解为元素(放入到容器的的一个个个体。
创建pair对象
#include<utility>
using namespace std;
pair<int,int>p;
pair模版类需要两个参数:首元素的数据类型和尾元素的数据类型。pair模版类对象有两个成员:first和second,分别表示首元素和尾元素。
在<utility
>中已经定义了pair上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first相等时再比较second,这符合大多数应用的逻辑。当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。
除了直接定义一个pair对象外,如果需要即时生成一个pair对象,也可以调用在<utility
>中定义的一个模版函数:make_pair。make_pair需要两个参数,分别为元素对的首元素和尾元素。
在map排序中使用pair
//按value自定义排序
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>//pair的头文件 C++为什么pair不使用utility
//也可以运行可能是其他头文件中包含了utility头文件。比如map头文件
using namespace std;
typedef pair<string, int> PAIR;
bool cmp_by_value(const PAIR &x, const PAIR &y) {
return x.second>y.second;//按value降序排列
//return x.second<y.second;//按value升序排列
}
int main() {
map<string, int>mp;
mp["a"] = 7;
mp["c"] = 9;
mp["e"] = 2;
mp.insert(make_pair("d",10));
mp.insert(make_pair("b",8));
//把map中元素转存到vector中
vector<PAIR> v(mp.begin(),mp.end());
sort(v.begin(), v.end(), cmp_by_value);
for (vector<pair<string,int> >::iterator it=v.begin();it!=v.end();++it)
{
cout<<it->first<<'\t'<<it->second<<endl;
}
return 0;
}