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

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

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

1. std::pair的原型:

// utility.h

template <class typeName1, class typeName2> 
struct pair
{
    typeName1  first;
    typeName2 second;
};

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

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

2. pair的构造

pair有三个构造函数:

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

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

pair<int,int> p4 = p2;

3. make_pair()函数来生成pair

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

std::pair <int,int> bar;

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

4. 列表初始化语法

根据c++11的新语法-列表初始化,我们可以在函数参数、函数返回值、直接赋值等时候直接使用{}来得到一个pair对象。

pair<int, float> p6{1, 2.2};
pair<int, float> p4;
p4 = {1, 2.4};

// 函数定义
pair<int, float> get_and_return_pair(pair<int, float> p) {
  cout << p.first << ',' << p.second << endl;
  return {1, 2.4};
}

//函数调用
pair<int, float> 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<int,float> p(1,2.2);
std::tie(a,b) = p;
cout<<a<<','<<b<<endl; // 1,2.4

//2 
std::pair<std::string, int> 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<pair<int,int>> v;
v.push_back(make_pair(x,y)); // 不推荐,可能发生隐式类型转换
v.push_back({x,y});   // 列表初始化的方法
pair<int,int> p(1,2);
v.insert(v.end(),p);
pair<int, float> 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<pair<int, float>> 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<int, float> p, const pair<int, float> 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中两个元素的顺序。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值