pair是c++中的一种模板类型,存储两个数值类型,既可以是已经存在的,也可以是自己定义的数值类型。
pair将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。
// utility.h
template
struct pair
{
typeName1 first;
typeName2 second;
};
std::pair是一个结构体模板,有两个成员,这两个成员可以直接用.
访问。
std::map的内部涉及到pair的使用,所以map头文件包含了#include头文件。
pair有三个构造函数:
using namespace std;
pair p1; //默认构造函数
p1.first = 1;
p1.second = 2;
pair p2(1,2); //初始值构造
pair p3(p2); //拷贝构造
pair是结构体,所以也可以直接用=
赋值:
pair p4 = p2;
make_pair()函数是在utility.h中的一个函数,返回一个pair对象。make_pair()会根据输入参数自动推导出返回pair的类型,并且可能会在不报警的情况下发生隐式转换
std::pair bar;
bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair
根据c++11的新语法-列表初始化,我们可以在函数参数、函数返回值、直接赋值等时候直接使用{}来得到一个pair对象。
pair p6{1, 2.2};
pair p4;
p4 = {1, 2.4};
// 函数定义
pair get_and_return_pair(pair p) {
cout << p.first << ',' << p.second << endl;
return {1, 2.4};
}
//函数调用
pair p5 = get_and_return_pair({2, 1.1});
// 打印: 2,1.1
更多列表初始化语法详见:
https://en.cppreference.com/w/cpp/language/list_initialization
std:;tie()在头文件tuple.h
中,可以获取pair中的元素值。
//1
int a;
float b;
std::pair p(1,2.2);
std::tie(a,b) = p;
cout<
//2
std::pair getPreson() {
return std::make_pair("Sven", 25);
}
int main(int argc, char **argv) {
std::string name;
int ages;
std::tie(name, ages) = getPreson();
std::cout << "name: " << name << ", ages: " << ages << std::endl;
return 0;
}
向vector中添加pair元素的方法如下:
vector> v;
v.push_back(make_pair(x,y)); // 不推荐,可能发生隐式类型转换
v.push_back({x,y}); // 列表初始化的方法
pair p(1,2);
v.insert(v.end(),p);
pair p7(3, 3.5);
v.insert(v.end(), p7);
v.emplace(v.end(), 4, 4.5); //since c++11
v.emplace_back(5, 5.5); //直接传入要构造的值就可以了
pair 默认对first升序,当first相同时对second升序.
vector> v;
v.emplace_back(2, 2.3);
v.emplace_back(2, 2.0);
v.emplace_back(1, 3.0);
v.emplace_back(3, 1.2);
sort(v.begin(), v.end());
for (int i = 0; i < 5; i++) {
cout << v[i].first << " " << v[i].second << endl;
}
输出:
1 3
2 2
2 2.3
3 1.2
5 5.5
当然,我们也可以自定义sort()的比较方式,以下例子按first降序,first相同时second降序排列:
bool cmp(const pair p, const pair p2) {
return (p.first > p2.first) ||
((p.first == p2.first) && p.second > p2.second);
}
using namespace std;
int main()
{
v.clear();
v.emplace_back(2, 2.3);
v.emplace_back(2, 2.0);
v.emplace_back(1, 3.0);
v.emplace_back(3, 1.2);
v.emplace_back(3, 3.3);
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < 5; i++) {
cout << v[i].first << " " << v[i].second << endl;
}
}
输出:
3 3.3
3 1.2
2 2.3
2 2
1 3
用std::swap()函数可以直接交换pair中两个元素的顺序。