当前位置: 首页 > 科技观察

如何使用C++多组元组?你熟悉吗?一起来看看

时间:2023-03-15 15:01:13 科技观察

前言元组是一个类似于pair的模板。每对的成员类型不同,但每对恰好有两个成员。不同元组类型不同,但一个元组可以有任意数量的成员。每个识别出的元组类型的成员数是固定的,但是一个元组类型的成员数可以不同于另一个元组类型。当我们想要将一些数据组合到一个对象中,但不想费心定义一个新数据来表示该数据时,元组很有用。例如,我们可以构造一个tupletupletp=make_tuple(sendPack,nSendSize);这个元组相当于一个结构structA{char*p;intlen;};你不需要用tupletp创建这个结构,效果是一样的,是不是更简洁直观?还有另一种创建元组的方法,使用std::tie,它将创建一个对元组的左值引用。autotp=returnstd::tie(1,"aa",2);tp的类型其实是:std::tupletuple初步印象tuple支持以下操作std::tuplet;//创建一个空元组对象(使用默认构造),其对应的元素分别为T1和T2...Tn类型,使用值初始化。std::tuplet2(v1,v2,...vn);//创建一个元组对象,其元素为T1和T2...Tn类型;每个成员用对应的vi初始化std::tuplet3(ref&);//元组的元素类型可以像pair一样是引用,也可以通过make_tuple创建元组对象。元组的类型是从初始值的类型推断出来的std::make_tuple(v1,v2);返回对t的第i个数据成员的引用:如果t是左值,则结果是左值引用;否则,结果是右值引用。此外,元组的所有成员都是公开的。get(t)我们可以把元组看作是一种“快速随意”的数据结构。定义和初始化元组当我们定义一个std::tuple时,我们需要指明每个成员的类型。tuplethreeD;//三个成员都设置为0tuple,int,list>someVal("constans",{3.14,2.718},42,{0,1,2,3,4,5});当我们创建一个std::tuple对象时,我们可以使用tuple的默认构造函数,它会初始化每个成员的值;也可以像上面的someVal一样初始化,为每个成员提供一个初始值,此时的构造函数是显式的,所以必须使用直接初始化的方式。tuplehtreeD={1,2,3};tuplehtreeD(1,2,3);类似于make_pair函数,标准库中定义了make_tuple函数,我们也可以使用它生成std::tuple对象。autoitem=mak_tuple("0-999-78345-x",3,20.00);与make_pair类似,make_tuple函数使用初始值的类型来推断元组的类型。在上面的示例中,item是元组类型的元组。访问元组的成员一对总是有两个成员,以便标准库可以命名它们(第一个和第二个),但这种命名方法不适用于元组,因为元组类型的成员数量是无限的。因为,元组的成员是未命名的。要访问元组的成员,使用称为get的标准库函数模板。为了使用get,我们必须指定一个明确的模板参数,它指示我们要访问哪个成员。我们传递以获取一个元组对象,该对象返回对指定成员的引用。autobook=get<0>(iterm);//返回iterm的第一个成员autocnt=get<0>(iterm);//返回iterm的第二个成员autoprice=get<0>(iterm)/cnt;//返回给iterm的第三个成员尖括号中的值必须是整型常量表达式。像往常一样,我们从0开始计数,这意味着get<0>是第一个成员。如果不知道元组的具体类型细节,可以使用两个辅助类模板来查询元组成员的个数和类型:1.一个可以由元组类型初始化的类模板,它有一个publicconstexprstaticdatanamedvalueType,类型为size_t,表示给定元组类型tuple_element::type2的成员个数。类模板可以由整数常量和元组类型初始化。它有一个名为type的公共成员,表示给定元组类型中指定的类型tuple_size::value通过这两个类模板我们可以得到我们需要的元组变量的成员数量和类型typedefdecltype(item)trans;//trans为item的类型size_tsz=tuple_size::value;//返回trans类型对象的成员个数tuple_element<1,trans>::typecnt;//cnt为第二个成员变量类型项目intTypecnt=get<1>(item);为了使用tuple_size或tuple_element,我们需要知道元组对象的类型。与往常一样,确定对象类型的最简单方法是使用decltype。在typedefdecltype(item)trans;中,我们使用decltype为item定义一个类型别名,并用它来实例化两个模板。tuple_size有一个名为value的公共静态数据成员,它表示给定元组中的成员数。除了元组类型之外,tuple_element模板还接受索引值。它有一个名为type的公共类型成员,表示给定元组类型中指定的成员类型。与get类似,tuple_element使用的索引也是从0开始计数。std::tuple上的关系和相等运算符的行为与容器上的对应运算符相同。这些运算符成对比较左元组和右元组的成员。只有当两个元组的成员数相同时,我们才能比较它们。此外,为了使用元组的相等或不等运算符,对每对成员使用==运算符必须是合法的;为了使用关系运算符,对每对成员使用<运算符必须是合法的。关系运算符和相等运算符:如果两个元组具有相同的成员数并且成员对应关系相等,则它们是相同的。tupleduo("1","2");tupletwoD(1,2);boolb=(duo==twoD);//报错,size_t和stringtuplethreeD(1,2,3);b=(duo==threeD);//报错,成员个数不同tupleorigin(0,0);b=(origintp;tp=std::make_tuple("斯文",25,"上海",21);//定义接收变量std::stringname;std::stringaddr;intages;intareaCode;std::tie(name,ages,addr,areaCode)=tp;std::cout<<"Output:"<<'\n';std::cout<<"name:"<::log(t);usingtype=typenamestd::tuple_element::type;std::stringts=typeid(type).name();type&v=std::get(t);std::cout<structPrinter{staticvoidlog(Tuple&t){usingtype=typenamestd::tuple_element<0,Tuple>::type;std::stringts=typeid(type).name();type&v=std::get<0>(t);std:cout<t=std::forward_as_tuple(11,true,"ok");Printer>::log(t);return1;}tuple使用元组返回多个值,元组的一个常见用法是从函数返回多个值。returntuplefunctiontuplefun(){//使用make_tuple构造元组returnmake_tuple(1024,"tuple",'3');}使用函数返回的元组autotp=fun();autoid=std::得到<0>(tp);autoname=std::get<1>(tp);autonum=std::get<2>(tp);二维码关注。转载本文请联系羽林君公众号。