返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何使用C++多元组Tuple
  • 475
分享到

如何使用C++多元组Tuple

2023-06-16 00:06:09 475人浏览 独家记忆
摘要

这篇文章主要讲解了“如何使用c++多元组Tuple”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用C++多元组Tuple”吧!前言tuple  是类似于pair的模板。每个p

这篇文章主要讲解了“如何使用c++多元组Tuple”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用C++多元组Tuple”吧!

前言

tuple  是类似于pair的模板。每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同tuole类型的也不相同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可以与另一个tuple类型不同。

当我们希望将一些数据组合成单一对象,但又不想麻烦地定义一个新数据来表示这些数据时,tuple是非常有用的。

例如我们可以构造一个tuple

tuple<const char*, int>tp = make_tuple(sendPack,nSendSize);

这个tuple等价于一个结构体

struct A {   char* p;   int len; };

用tupletp就可以不用创建这个结构体了,而作用是一样的,是不是更简洁直观了

还有一种方法也可以创建元组,用std::tie,它会创建一个元组的左值引用。

auto tp = return std::tie(1, "aa", 2);

tp的类型实际是:

std::tuple<int&,string&, int&>

tuple初印象

tuple支持如下的操作

std::tuple<T1, T2, ...TN> t;            //创建一个空的tuple对象(使用默认构造),它对应的元素分别是T1和T2...Tn类型,采用值初始化。 std::tuple<T1, T2, ...TN> t2(v1, v2, ... vn);    //创建一个tuple对象,它的元素分别是T1和T2 ...Tn类型; 每个成员用对应的vi进行初始化 std::tuple<T1&> t3(ref&); // tuple的元素类型可以是一个引用

像pair一样也可以通过make_tuple进行创建一个tuple对象,tuple的类型从初始值的类型推断

std::make_tuple(v1, v2);

返回t的第i个数据成员的引用:如果t是一个左值,结果是一个左值引用;否则,结果是一个右值引用。此外tuple的所有成员都是pulic的。

get<i>(t)

我们可以将tuple看作一个“快速而随意”的数据结构

定义和初始化tuple

当我们定义一个std::tuple时,需要指出每个成员的类型。

tuple<size_t,size_t,size_t> threeD; //三个成员都被设置为0  tuple<string,vector<doble>,int ,list<int>> someVal("constans",{3.14,2.718},42,{0,1,2,3,4,5});

当我们创建一个std::tuple对象时,可以使用tuple的默认构造函数,它会对每个成员进行值初始化;也可以向上面someVal初始化一样,为每个成员提供一个初始值,此时的构造函数是explicit的,因此必须使用直接初始化方法。

tuple<size_t,size_t,size_t> htreeD = {1,2,3}; tuple<size_t,size_t,size_t> htreeD(1,2,3);

类似make_pair函数,标准库定义了make_tuple函数,我们还可以使用它来生成std::tuple对象。

auto item = mak_tuple("0-999-78345-x",3,20.00);

类似make_pair,make_tuple函数使用初始值的类型来推断tuple的类型。在上面示例中,item是一个tuple,类型为tuple.

访问tuple的成员

一个pair总是有两个成员,这样标准库就可以为他们命名(first和second),但是这种命名方法不适用于tuple,因为一个tuple的类型的成员数目是没有限制的。因为,tuple的成员都是未命名的。要访问一个tuple的成员,就要使用一个名为get的标准库函数模板。为了使用get,我们必须指定一个显示模板实参,它指出我们想要访问第几个成员。我们传递给get一个tuple对象,它返回指定成员的引用。

auto book  = get<0>(iterm); //返回iterm的第一个成员 auto cnt  = get<0>(iterm); //返回iterm的第二个成员 auto price  = get<0>(iterm)/cnt; //返回iterm的第三个成员

尖括号中的值必须是一个整型常量表达式,与平时一样,我们从0开始计数,意味着get<0>是第一个成员。

如果不知道tuple准确的类型细节信息,可以用两个辅助类模板查询tuole的成员的数量和类型:

一个类模板,可以通过一个tuple类型初始化,它有一个名为value的public constexpr  static数据类型,类型为size_t,表示给定tuple类型中成员数量

tuple_element<i,tupleType>::type

一个类模板,可以通过一个整型常量和一个tuple类型来初始化。它有一个名为type的public成员,表示给定tuple类型中指定的类型

tuple_size<tupleType>::value

通过这两个类模板我们可以获得我们需要的tuple变量的成员数量和类型

typedef decltype(item) trans;//trans是item的类型  size_t sz = tuple_size< trans>::value;//返回trans类型对象中成员的数量  tuple_element<1,trans>::type cnt ; // cnt 为 item第二个成员变量类型  int型  cnt = get<1>(item);

为了使用tuple_size或tuple_element,我们需要知道一个tuple对象的类型。与往常一样,确定一个对象的类型的最简单的方法就是使用decltype,在typedef  decltype(item) trans;中,我们使用decltype来为item定义一个类型别名,用它来实例化这两个模板。

tuple_size有一个名为value的public static数据成员,它表示给定tuple中成员的数量。  tuple_element模板除了一个tuple类型外,还接受一个索引值。它有一个名为type的public类型成员,表示给定tuple类型中指定成员类型。类似get,tuple_element所使用的索引也是从0开始计数的。

std::tuple的关系和相等运算符的行为类似容器的对应操作。这些运算符逐对比较左侧tuple和右侧tuple的成员。只有两个tuple具有相同数量的成员时,我们才可以比较它们。而且,为了使用tuple的相等或不等运算符,对每对成员使用==运算符必须都是合法的;为了使用关系运算符,对每对成员使用  < 必须都是合法的。

关系和相等运算符:当两个tuole具有相同数量的成员且成员对应相等时,两个才tuple相同。

tuple<string,string> duo("1","2"); tuple<size_t,size_t> twoD(1,2);  bool b = (duo == twoD); // 错误,不能比较size_t 和 string  tuple<size_t,size_t,size_t> threeD(1,2,3);  b = (duo == threeD); // 错误,成员数量不同 tuple<size_t,size_t> origin(0,0);  b = (origin < twoD); // 正确:b为true

由于tuple定义了<和==运算符,我们可以将tuple序列传递给算法,并且可以在无序容器中将tuple作为关键字类型。

利用tie进行解包元素的值

如同pair一样也是可以通过tie进行解包tuple的各个元素的值。如下tuple对象有4个元素,通过tie解包将会把这4个元素的值分别赋值给tie提供的4个变量中。

int main(int arGC, char **argv) {     std::tuple<std::string, int, std::string, int> tp;     tp = std::make_tuple("Sven", 25, "Shanghai", 21);     // 定义接收变量     std::string name;     std::string addr;     int ages;     int areaCode;       std::tie(name, ages, addr, areaCode) = tp;     std::cout << "Output: " << '\n';     std::cout << "name: " << name <<", ";     std::cout << "addr: " << addr << ", ";     std::cout << "ages: " << ages << ", ";     std::cout << "areaCode: " << areaCode << '\n';     return 0; }

输出结果:

name: Sven, addr: Shanghai, ages: 25, areaCode: 21

但有时候tuple包含的多个元素时只需要其中的一个或两个元素,如此可以通过std::ignore进行变量占位,这样将会忽略提取对应的元素。可以修改上述例程:

std::tie(name, ages, std::ignore, std::ignore) = tp;

std::tuple中元素是被紧密地存储的(位于连续的内存区域),而不是链式结构。

如何遍历tuple成员

N表示tuple中的第N个元素

#include <iOStream> #include <tuple> #include <string>   using namespace std;   template<typename Tuple, int N = std::tuple_size<Tuple>::value> struct Printer {   static void log(Tuple& t) {     Printer<Tuple, N - 1>::log(t);       using type = typename std::tuple_element<N - 1, Tuple>::type;     std::string ts = typeid(type).name();     type& v = std::get<N - 1>(t);       std::cout << ts << ":" << v << std::endl;   } };   template<typename Tuple> struct Printer<Tuple,  1> {   static void log(Tuple& t) {     using type = typename std::tuple_element<0, Tuple>::type;     std::string ts = typeid(type).name();     type& v = std::get<0>(t);       std::cout << ts << ":" << v << std::endl;   } };   int main() {   std::tuple<int, bool, string> t = std::forward_as_tuple(11, true, "ok");   Printer<std::tuple<int, bool, string>>::log(t);     return 1; }

tuple做返回相关作用

使用tuple返回多个值,tuple的一个常见用途就是从一个函数返回多个值。

返回tuple的函数

tuple<int, string> fun() {         // 用make_tuple来构造一个tuple return make_tuple(1024, "tuple",'3'); }

使用函数返回的tuple

auto tp = fun(); auto id      = std::get<0>(tp);  auto name= std::get<1>(tp);  auto num  = std::get<2>(tp);

感谢各位的阅读,以上就是“如何使用C++多元组Tuple”的内容了,经过本文的学习后,相信大家对如何使用C++多元组Tuple这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何使用C++多元组Tuple

本文链接: https://lsjlt.com/news/281958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用C++多元组Tuple
    这篇文章主要讲解了“如何使用C++多元组Tuple”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用C++多元组Tuple”吧!前言tuple  是类似于pair的模板。每个p...
    99+
    2023-06-16
  • 浅析C++元组tuple类型
    目录介绍tuple的定义及初始化tuple的使用成员访问获取tuple信息拼接tuple交换tupletuple解包tuple比较tuple遍历tuple开发时的应用介绍 元组tup...
    99+
    2024-04-02
  • Python的元组Tuple怎么用
    这篇文章主要介绍“Python的元组Tuple怎么用”,在日常操作中,相信很多人在Python的元组Tuple怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的元组Tuple怎么用”的疑惑有所...
    99+
    2023-06-29
  • Python使用list列表和tuple元组的方法
    list: Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。 比如,列出寝室所有室友的名字,就可以用一个list表示: roo...
    99+
    2024-04-02
  • python使用tuple函数将列表转换为元组
    在python中使用tuple()函数将列表转换为元组的方法tuple:tuple()函数的作用是将列表转换为元组。tuple()函数语法:tuple( iterable )参数:iterable:表示需要转换为元组的可迭代序列。tuple...
    99+
    2024-04-02
  • 一文搞懂Python中列表List和元组Tuple的使用
    目录列表 List列表是有序的列表可以包含任意对象通过索引访问列表元素列表嵌套列表可变元组 Tuple定义和使用元组元素对比列表的优点元组分配、打包和解包List 与 Tuple 的...
    99+
    2024-04-02
  • TypeScript如何使用元组
    这篇文章主要为大家展示了“TypeScript如何使用元组”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“TypeScript如何使用元组”这篇文章吧。巧用元组有...
    99+
    2024-04-02
  • C++友元如何使用
    本文小编为大家详细介绍“C++友元如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++友元如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、友元的概念什么是友元友元是 C++ 中的一种关系友元关...
    99+
    2023-06-30
  • C#二维数组与多维数组如何使用
    这篇文章主要介绍“C#二维数组与多维数组如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#二维数组与多维数组如何使用”文章能帮助大家解决问题。C# 中同样支持多维数组(也可称为矩形数组),它...
    99+
    2023-07-05
  • python中tuple函数如何使用
    在Python中,tuple()函数可以将一个可迭代对象转换为元组(tuple)。可迭代对象可以是列表、字符串、字典、集合等。以下是...
    99+
    2023-09-14
    python
  • 如何调用DIV元素和SPAN元素分组多元素
    这篇文章给大家介绍如何调用DIV元素和SPAN元素分组多元素,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。你对利用DIV元素和SPAN元素分组元素方法是否熟悉,这里和大家分享一下,利用...
    99+
    2024-04-02
  • python具名元组如何使用
    这篇文章主要介绍了python具名元组如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python具名元组如何使用文章都会有所收获,下面我们一起来看看吧。collections.namedtuple用于构...
    99+
    2023-07-05
  • 如何把Python嵌入C/C++元组以及应用
    这篇文章给大家介绍如何把Python嵌入C/C++元组以及应用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。把Python嵌入C/C++的元组操作在Python/C API中提供了PyTuple_New()函...
    99+
    2023-06-17
  • C++多态如何使用
    本文小编为大家详细介绍“C++多态如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++多态如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。多态多态离不开继承,首先来定义一个基类 Anim...
    99+
    2023-07-02
  • Python基础数据类型tuple元组的概念与用法
    目录元组简单介绍 声明元组 元组与列表的区别 特殊的元组 元组的简写 元组常见运算操作 索引 [ ] 取值 切片 [ : : ] 取值 运算符 + 运算符 * 关键字 in 常见函数...
    99+
    2024-04-02
  • Python列表和元组如何使用
    这篇文章主要介绍“Python列表和元组如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python列表和元组如何使用”文章能帮助大家解决问题。列表学习要点先看一遍列表定义:列表是可变序列,也...
    99+
    2023-07-04
  • css如何使用多重伪元素
    这篇文章给大家分享的是有关css如何使用多重伪元素的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 可以结合多个伪元素来使用。 在下面的例子中,段落的第一个字母将显示为红色,其...
    99+
    2024-04-02
  • C++中如何使用友元函数
    本篇文章为大家展示了C++中如何使用友元函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。定义:允许一个类将对其非公有成员的访问权授予指定的类或函数(分别是友元类和C++友元函数)。说明:友元是非成...
    99+
    2023-06-17
  • Python基础数据类型中tuple元组的概念和用法
    本篇内容主要讲解“Python基础数据类型中tuple元组的概念和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python基础数据类型中tuple元组的概念和用法”吧!目录元组简单介绍声明...
    99+
    2023-06-20
  • C++中如何使用auto表示多维数组指针
    C++中如何使用auto表示多维数组指针,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。多维数组的指针多维数组是一种常见的数据结构,实际上是数组的数组。这个含义虽...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作