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());

参考资料:

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

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

posted @ 2021-02-04 08:52  浩天之家  阅读(256)  评论(0编辑  收藏  举报