STL的<utility>头文件中描述了一个非常简单的模板类pair,用来表示一个二元组或元素对,并提供了大小比较的比较运算符模板函数。
pair模板类需要两个参数:首元素的数据类型和尾元素的数据类型。pair模板类对象有两个成员:first和second,分别表示首元素和尾元素。
在<utility>中已经定义了pair上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first相等时再比较second,这符合大多数应用的逻辑。当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。
// map/pair-test.cpp - Show basic use of pair.
#include <utility>
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
//-- Declare a pair variable.
pair<string, int> pr1;
//-- Declare and initialize with constructor.
pair<string, int> pr2("heaven", 7);
cout << pr2.first << "=" << pr2.second << endl;
// Prints heaven=7
//-- Declare and initialize pair pointer.
pair<string, int>* prp = new pair<string, int>("yards", 9);
cout << prp->first << "=" << prp->second << endl;
// Prints yards=9
//-- Declare map and assign value to keys.
map<string, string> engGerDict;
engGerDict["shoe"] = "Schuh";
engGerDict["head"] = "Kopf";
//-- Iterate over map. Iterator value is a key-value pair.
// Iteration in map is in sorted order.
map<string, string>::const_iterator it;
//声明一个map迭代器的指针
//for体现出的是map迭代器的排列顺序
for (it=engGerDict.begin(); it != engGerDict.end(); ++it) {
cout << it->first << "=" << it->second << endl;
}
// Prints head=kopf
// shoe=Schuh
system("PAUSE");
return 0;
}
除了直接定义一个pair对象外,如果需要即时生成一个pair对象,也可以调用在<utility>中定义的一个模板函数:make_pair。make_pair需要两个参数,分别为元素对的首元素和尾元素。
// Illustrates how to use the make_pair function.
// Functions: make_pair - creates an object pair containing two data
// elements of any type.
#include <utility>
#include <iostream>
using namespace std;
/* STL pair data type containing int and float
*/
typedef struct pair<int,float> PAIR_IF;
int main(void)
{
PAIR_IF pair1=make_pair(18,3.14f);
cout << pair1.first << " " << pair1.second << endl;
pair1.first=10;
pair1.second=1.0f;
cout << pair1.first << " " << pair1.second << endl;
}
1.pair的应用
pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存(说简单点就是映射)。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 简而言之pair就是结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
2 make_pair函数
make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象很方便。
1. 利用make_pair进行赋值运算!!!
pair<int, double> p1;
p1 = make_pair(1, 1.2);
2. pair可以接受隐式的类型转换,这样可以获得更高的灵活度。灵活度也带来了一些问题!!!
std::pair<int, float>(1, 1.1);
std::make_pair(1, 1.1);
是不同的,第一个就是float,而第2个会自己匹配成double。
3. make_pair创建声明 和 初始化 和 构造方法:
pair<string,string> name;
pair<string,vector<int>> data;
以上全部调用pair类型的默认构造函数对其成员进行数值初始化,成员初始化为make_pair
也能在定义时提供初始化式:
构造方法:
pair<int, double> p1; //使用默认构造函数
pair<int, double> p2(1, 2.4); //用给定值初始化
pair<int, double> p3(p2); //拷贝构造函数
4. 创建与赋值小结代码:
#include<iostream>
#include<utility>
#include<string>
using namespace std;
pair<string,int> p;
int main()
{
string str = "直接复制也可以";
int m =19;
// cin>>p.first>>p.second; 法一
// p.first=str;p.second=m; 法二
p = make_pair("ghgfhgfh",m);//法三
cout<<p.first<<p.second<<endl;
return 0;
}
3 make_pair函数 及其迭代器的嵌套
举个例子:map是一个关联容器,里面存放映射,
容器中每一元素都是pair类型,通过map的insert()方法来插入元素(pair类型)。
在vector中的使用:
#include<iostream>
#include<utility>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool strict_weak_ordering(pair<int,string>a,pair<int,string>b)
{ return a.first < b.first; }
int main()
{
vector<pair<int,string> > vec;
vec.push_back(make_pair<int, string>(5, "heo"));
vec.push_back(make_pair<int, string>(4, "hell"));
vec.push_back(make_pair<int, string>(6, "hlo,"));
sort(vec.begin(), vec.end(), strict_weak_ordering);
vector<pair<int, string> >::iterator it = vec.begin(), end = vec.end();
for(;it != end; ++it)
cout<<it->second<<endl;
}
利用vector存储piar类型,并通过sort对各pair类型数据的begin()排序,
最后借助迭代器输出pair类型数据的second().