C++ Primer笔记——tuple类型

tuple类型

《C++ Primer》 17.1 tuple类型(P636)

tuple是一种定义在标准库中的类似于pair的模板。pair的成员为两个不同的类型,tuple同样要求成员类型不同,但是tuple可以有任意数量的成员

(一).定义

定义一个tuple对象时,可以使用默认的构造函数,它会为每个成员进行默认初始化。当然也可以手动初始化。

tuple<int, string, int> tp1;//使用默认构造进行初始化
tuple<int, string, int> tp2{ 1, "hello", 2 };//自定义直接初始化
tuple<int, string, int> tp3 = { 1, "hello", 2 };//错误,并非直接初始化

值得注意的是,《C++ Primer》说“tuple的构造函数是explicit,因此必须使用直接初始化”,因此tp3应该编译失败。但是在VS2019环境实测中,编译是正常通过的,应该是VS对tuple类型进行了优化,支持了隐式类型转换。

类似make_pair函数,标准库定义了make_tuple函数来生成tuple对象:

auto tp4 = make_tuple<int, string, int>(1, "hello", 2);
auto tp5 = make_tuple(1, "hello", 2);

需要说明的是,如果没有为make_tuple指明变量类型, 例如“hello”就会默认是const char*类型。

(二).使用

访问tuple成员时,需要使用名为get的标准库函数模板,用法如下:

auto tp1 = make_tuple<int, string, int>(1, "hello", 2);
int a = get<0>(tp1);
string str = get<1>(tp1);
int b = get<2>(tp1);

当我们访问tuple成员时,从0开始计数,因此get<0>的含义是tuple的第一个成员。

get函数所返回的是成员的引用

获取未知tuple对象的类型

auto tp1 = make_tuple<int, string, int>(1, "hello", 2);
typedef decltype(tp1) TUPLE_TYPE;//使用decltype来获取tp1的类型
TUPLE_TYPE tp2;
//获取tp1的类型,定义别名为TUPLE_TYPE,来定义对象tp2。

获取tuple中成员总数

size_t sz = tuple_size<TUPLE_TYPE>::value;

获取tuple某个具体成员的类型

tuple_element<0, TUPLE_TYPE>::type a = get<0>(tp1);
//a类型为int,即tp1第一个成员的类型。

 tuple对象间关系运算

只能是同类型同数量成员的tuple才能比较。

在比较时与string类似,按照成员顺序依次对比,当前成员对比不同时,tuple对比结果即当前成员对比结果;当前成员对比相同时,对比下一个成员。

auto tp1 = make_tuple<int, int>(6, 2);
auto tp2 = make_tuple<int, int>(1, 9);
auto tp3 = make_tuple<string, string>("world", "hello");
bool judge1 = (tp1 > tp2);//结果为1
bool judge2 = (tp1 == tp2);//结果为0
bool judge3 = (tp1 > tp3);//错误,成员类型不同

  tuple交换数据

auto tp1 = tuple<int, int, string>(1, 2, "");
auto tp2 = tuple<int, int, string>(3, 4, "world");
tp2.swap(tp1);//数据交换

  tuple解包

auto tp1 = tuple<int, int, string>(1, 2, "");
auto tp2 = tuple<int, int, string>(3, 4, "world");
int a, b; 
string str;
tie(a, b, str) = tp2;//使用tie来解包

(三).作为返回值

tuple作为返回值时可以间接返回多个值,可理解成将多个返回值“打包”后返回。

tuple<int, string, int> func(int a, int b, string str)
{
	return tuple<int, string, int>(a, str, b);
}

int main()
{
	auto ret = func(1, 2, "hello");
	cout << get<0>(ret);
	return 0;
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就要 宅在家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值