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 \n", std::get<0>(tp2).c_str());
name = "abc"; // 对name的修改,会影响tp2中的值
printf("after change:%s \n", std::get<0>(tp2).c_str());
参考资料: