tuple介绍

c++11引入的tuple,它是一个固定大小的集合,不同于vector中每个元素类型需要一样,它可包含不同类型的数值,相当于将不同类型 的数据打包在一起。

基本使用

初始化tuple

#include<tuple>

string cs("test");
int a(1023);
std::tuple<std::string, int> t = std::make_tuple(cs, a);
std::tuple<std::string, int> t2("test2", 100);

获取tuple的内容:


// 获取tuple中元素个数
size_t num = std::tuple_size<decltype(t)>::value;

// 按位置索引获取指定元素,索引值从0开始
auto stringvalue = std::get<0>(t);	// t左右一定要加挂号

auto intvalue = std::get<1>(t);

// 可使用tie来批量解包tuple中的内容
string name;
int value;
std::tie(name, value) = t;

// 如仅需tuple中指定位置的元素,可使用std::ignore当做占位符屏蔽
int value2;
std::tie(std::ignore, value2) = t;

应用

tuple用于打包聚合多个数据,可创建匿名结构体,如下:

   struct person {
    char *m_name;
    char *m_addr;
    int  *m_ages;
};
 
std::tuple<const char *, const char *, int>

笔者觉得结构体中的成员名称带有语义信息,使用tuple,虽说有简化,但丢失语义描述信息,得不偿失。

两个tuple的比较,要求两个tuple元素数量相同,对应位置的类型可比较。

tuple不支持迭代,只能通过索引位置来获取元素的值,索引位置必须是编译期确定,不支持动态期传递,否则将发生编译错误。

	for (int i = 0; i < 2; i++)
	{
		// 这会触发编译错误
		auto test2 = std::get<i>(t);
	}

tuple中存储引用,在初始化时,需要使用另外一个tuple来初始化。


std::tuple<std::string> tp1("test");
std::string name;
// 定义一个tp2,元素类型为string&,由tp1来进行初始化
autp tp2 = make_tuple(std::ref(name)) = tp1;
printf("before change:%s 
", std::get<0>(tp2).c_str());
name = "abc";	// 对name的修改,会影响tp2中的值
printf("after change:%s 
", std::get<0>(tp2).c_str());

参考资料:

  1. C++ tuple元组的基本用法(总结)

  2. c++11中的tuple(元组)

作者:浩天之家
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
Top
收藏
关注
评论
原文地址:https://www.cnblogs.com/cherishui/p/14370744.html