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

std::pair std::tuple std::tie,第1张

std::pair
固定包含两个数据,Defined in header
场景
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(1, 1.1);
std::make_pair(1, 1.1);
是不同的,第一个就是float,而第2个会自己匹配成double。
类模板:template struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。
具体用法:
 定义(构造):
  pair p1;  //使用默认构造函数
  pair p2(1, 2.4);  //用给定值初始化
  pair p3(p2);  //拷贝构造函数
 访问两个元素(通过first和second):
  pair p1;  //使用默认构造函数
  p1.first = 1;
  p1.second = 2.5;
  cout << p1.first << ' ' << p1.second << endl;
 输出结果:1 2.5
 
 赋值operator = :
 (1)利用make_pair:
     pair p1;
     p1 = make_pair(1, 1.2);
 (2)变量间赋值:
     pair p1(1, 1.2);
     pair p2 = p1;
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
typedef pair author;
author pro("May", "Lily");


std:tuple


固定大小的集合  Defined in header
场景
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 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 t3 = {1, 2.0, "3"};
tie(i, d, s) = t3;
t3 = {1, 2.0, "3"};
tie(i, d, s) = {1, 2.0, "3"};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1295664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存