std::pair std::tuple std::tie

std::pair
固定包含两个数据,Defined in header <utility>
场景
pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
make_pair函数
template pair make_pair(T1 a, T2 b) { return pair(a, b); }
很明显,我们可以使用pair的构造函数也可以使用make_pair来生成我们需要的pair。 一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象很方便,代码也很清晰。 另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。灵活度也带来了一些问题如:
std::pair<int, float>(1, 1.1);
std::make_pair(1, 1.1);
是不同的,第一个就是float,而第2个会自己匹配成double。
类模板:template <class T1, class T2> struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。
具体用法:
 定义(构造):
  pair<int, double> p1;  //使用默认构造函数
  pair<int, double> p2(1, 2.4);  //用给定值初始化
  pair<int, double> p3(p2);  //拷贝构造函数
 访问两个元素(通过first和second):
  pair<int, double> p1;  //使用默认构造函数
  p1.first = 1;
  p1.second = 2.5;
  cout << p1.first << ' ' << p1.second << endl;
 输出结果:1 2.5
 
 赋值operator = :
 (1)利用make_pair:
     pair<int, double> p1;
     p1 = make_pair(1, 1.2);
 (2)变量间赋值:
     pair<int, double> p1(1, 1.2);
     pair<int, double> p2 = p1;
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
typedef pair<string, string> author;
author pro("May", "Lily");


std:tuple


固定大小的集合  Defined in header <tuple>
场景
std::pair 可以打包最多两个值到一个类里,常用在需要返回两个值的函数里,因为可以不需要自己定义一个wrapper类,普通集合类肯定不能用,因为C++的集合只能存储泛型的(相同类型)对象. 如果要存储超过2个不同类型的对象, 可以使用 std::tuple, 它能存储最多10个不同对象类型. 是不是发现Java的集合可以存储任意类型强大很多,因为Java对象有共同的根类型,Object.
std::tuple是一个类模板,它能存储固定大小的(10个 vs2010)不同类型对象,它是std::pair的泛化类型.
std::tuple 也可以结合std::tie 来接收函数返回时 unpack 集合里的元素.

tuple即元组,可以理解为pair的扩展,可以用来将不同类型的元素存放在一起,常用于函数的多返回值。

定义与初始化

tuple可以使用初始化列表进行赋值。

tuple<int,double,string> t3 = {1, 2.0, "3"};
  • 1

访问

可以使用get<常量表达式>(tuple_name)来访问或修改tuple的元素(返回引用)

get<0>(t3) = 4;
cout << get<1>(t3) << endl;
  • 1
  • 2

会输出2

批量赋值

std::tie会将变量的引用整合成一个tuple,从而实现批量赋值。

int i; double d; string s;
tie(i, d, s) = t3;
cout << i << " " << d << " " << s << endl;
  • 1
  • 2
  • 3

会输出4 2 3

还可以使用std::ignore忽略某些tuple中的某些返回值,如

tie(i, ignore, s) = t3;
  • 1

其它

需要注意的是,tie无法直接从初始化列表获得值,比如下面第5行会编译错误。

int i; double d; string s;
tuple<int,double,string> t3 = {1, 2.0, "3"};
tie(i, d, s) = t3;
t3 = {1, 2.0, "3"};
tie(i, d, s) = {1, 2.0, "3"};
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值