[c++] std::pair的用法

pair是c++中的一种模板类型,存储两个数值类型,既可以是已经存在的,也可以是自己定义的数值类型。

pair将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。

1. std::pair的原型:

// utility.h

template  
struct pair
{
    typeName1  first;
    typeName2 second;
};

std::pair是一个结构体模板,有两个成员,这两个成员可以直接用.访问。

std::map的内部涉及到pair的使用,所以map头文件包含了#include头文件。

2. pair的构造

pair有三个构造函数:

using namespace std; 
pair p1; //默认构造函数
p1.first = 1;
p1.second = 2;
pair p2(1,2); //初始值构造
pair p3(p2); //拷贝构造

pair是结构体,所以也可以直接用=赋值:

pair p4 = p2;

3. make_pair()函数来生成pair

make_pair()函数是在utility.h中的一个函数,返回一个pair对象。make_pair()会根据输入参数自动推导出返回pair的类型,并且可能会在不报警的情况下发生隐式转换

std::pair  bar;

bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair

4. 列表初始化语法

根据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

5. std::tie()解包pair

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;
}

6. std::vector与pair

向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);     //直接传入要构造的值就可以了

7. std::sort()与pair

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

8. std::swap(std::pair)

用std::swap()函数可以直接交换pair中两个元素的顺序。

你可能感兴趣的:(C/C++,c++,stl)