C++-标准库 std::pair介绍

构造函数

std::pair有三种构造函数形式

pair(const T1& x,const T2& y);
pair(U&& x, V&& y);
template <typename... Args1, typename... Args2>
pair(piecewise_construct_t, 
	 tuple<Args1...> first_args,
	 tuple<Args2...> second_args);

前两个构造函数是我们常见的形式,传递一个实参给first,另一个实参给second:

std::pair<char*, int> a("age",42); 

C++ standard指明,构造函数可能的话将使用支持move语义,否则使用copy语义。
第三个构造函数的含义是,将first_args tuple中的元素作为参数传递给first类型的构造函数,first_args tuple中的元素作为参数传递给second类型的构造函数,piecewise_construct_t是一个struct类型。
举例:

tuple<int, float> t(1,2.22);
pair<int,Foo> p(std::piecewise_construct, std::make_tuple<42>, t);

std::piecewise_construct是std内部声明的一个变量,t中的1和2.22将作为Foo类的构造函数参数传入。由于pair的第三种构造函数必须有两个tuple,所以42也需要使用tuple包起来。
这种初始化形式的必要性发生在当我们需要emplace一个新的元素到map或multimap中时

std::make_pair

当传递std::pair类型的函数参数,我们使用std::make_pair更为方便,并且无需写出模板参数

func(std::make_pair("age", 42));

这样做的代价是,类型推断可能并不准确,如"age"推断为const char*而非const char[2],对类型要求精确的场景下应注意。

比较

当两个元素都相同时,两个pair才视为相等;first优先级大于second,当first不等时,返回first比较结果,否则继续比较second

移动语义和引用语义

移动:

std::string s1, s2;
auto p = std::make_pair(std::move(s1), std::move(s2));
// 移动s1, s2到pair中,之后不再使用

引用:

int i = 0;
auto p = std::make_pair(std::ref(i), std::ref(i)); // auto推导类型为std::pair<int&, int&>
// 或者
// auto p = std::pair<int&, int&>(i, i);
p.first++;
p.second++;
// 此时i = 2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mrbone11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值