c++标准库(笔记):std::tuple

本文深入探讨C++中的tuple,一种可存储任意数量和类型的元素的数据结构。从tuple的构建、元素访问到其特性如tuple_size、tuple_element和tuple_cat的使用,全面解析tuple的运用场景与限制。
摘要由CSDN通过智能技术生成

tuple是TR1引入的,它扩展了pair的概念,可以拥有任意数量的元素。

tuple的构建与元素访问:
tuple<int,float,string> t1(41,6.3,"niconiconi")
auto t2 = make_tuple(22,44,"niconiconi");
get<0>(t1);
get<1>(t1);

注1:tuple的元素类型可以是引用:
string s;
tuple<string&> t(s);
get<0>(t) = "hello"; //s也被赋值为"hello"

注2:tuple不允许迭代元素。tuple必须在编译器知道元素的索引值, 如果在运行期才传入索引值
是不被允许的:

int i=0;
get<i>(t); //编译报错:i is no compile-time value
另:如果给的是无效索引,在编译期就会报错,故不用担心超出范围

注3:在tuple的各个构造函数中,接收不定个数的实参的版本被声明为explicit,这是为了避免单
个值被隐式转换为“带着一个元素的”tuple:

template<typename... Args>
void foo(const std::tuple<Args...> t);
foo(21); //error
foo(make_tuple(42));
在这种情况下,就不可以通过赋值将某个tuple初始化,因为这样会被视为一个隐式转换:
std::tuple<int, double> t3 = {42, 3.14}; //error
也不可以这样:
std::vector<std::tuple<int, float> > v{ {1, 1.1}, {2, 2.2}};
或这样:
std::tuple<int,int,int> foo()
{
  return {1,2,3};
}
综上可知:对于tuple,必须明确指明该值为一个tuple(例如:可以运用make_pair)

运用引用搭配make_tuple()可以提取tuple的元素值,将某些变量值设给它们:
std::tuple<int,float,std::string> t(77,1.1, "more light");
int i;
float f;
std::string s;
auto t1 = std::make_tuple(std::ref(i), std::ref(f), std::ref(s)) = t;
这样就可以通过修改变量i、f、s的值修改t1;
也可以通过std::tie,它可以建立一个内含引用的tuple
std::tie(i,f,s) = t;
使用std::tie时,std::ignore允许忽略tuple的某些元素,也就是可以只提取tuple的一部分:
std::tie(i,std::ignore,s) =t;

tuple的其他特性:
tuple_size<tupletype>::value //获取元素个数
tuple_element<idx, tupletype>::type //获取第idx个元素的类型
tuple_cat() //可将多个tuple串联成一个tuple

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值