C++11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。

tuple 的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用 tuple;当函数需要返回多个数据时,可以将这些数据存储在 tuple 中,函数只需返回一个 tuple 对象即可。

tuple是一个固定大小的不同类型值的集合,是泛化的std::pair。我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员,因此在需要保存3个及以上的数据时就需要使用tuple元组了。

tuple 模板类对象常用的方法

tuple 模板类对象常用的方法有两种,一种是借助该类的构造函数,另一种是借助 make_tuple() 函数。

类的构造函数

tuple 模板类提供有很多构造函数,包括:

  1. 默认构造函数
constexpr tuple();
  1. 拷贝构造函数
tuple (const tuple& tpl);
  1. 移动构造函数
tuple (tuple&& tpl);
  1. 隐式类型转换构造函数
template <class... UTypes>tuple (const tuple<UTypes...>& tpl); //左值方式
template <class... UTypes>tuple (tuple<UTypes...>&& tpl);      //右值方式
  1. 支持初始化列表的构造函数
explicit tuple (const Types&... elems);  //左值方式
template <class... UTypes>explicit tuple (UTypes&&... elems);  //右值方式
  1. 将pair对象转换为tuple对象
template <class U1, class U2>tuple (const pair<U1,U2>& pr);       //左值方式
template <class U1, class U2>tuple (pair<U1,U2>&& pr);            //右值方式

例子:

#include <iostream>     // std::cout
#include <tuple>        // std::tuple
using std::tuple;int main()
{std::tuple<int, char> first;                             // 1)   first{}std::tuple<int, char> second(first);                     // 2)   second{}std::tuple<int, char> third(std::make_tuple(20, 'b'));   // 3)   third{20,'b'}std::tuple<long, char> fourth(third);                    // 4)的左值方式, fourth{20,'b'}std::tuple<int, char> fifth(10, 'a');                    // 5)的右值方式, fifth{10.'a'}std::tuple<int, char> sixth(std::make_pair(30, 'c'));    // 6)的右值方式, sixth{30,''c}return 0;
}

make_tuple()函数

上面程序中,我们已经用到了 make_tuple() 函数,它以模板的形式定义在 头文件中,功能是创建一个 tuple 右值对象(或者临时对象)。

对于 make_tuple() 函数创建了 tuple 对象,我们可以上面程序中那样作为移动构造函数的参数,也可以这样用:

auto first = std::make_tuple (10,'a');   // tuple < int, char >
const int a = 0; int b[3];
auto second = std::make_tuple (a,b);     // tuple < int, int* >

程序中分别创建了 first 和 second 两个 tuple 对象,它们的类型可以直接用 auto 表示。

tuple的创建和初始化

std::tuple<T1, T2, TN> t1;            //创建一个空的tuple对象(使用默认构造),它对应的元素分别是T1和T2...Tn类型,采用值初始化。
std::tuple<T1, T2, TN> t2(v1, v2, ... TN);    //创建一个tuple对象,它的两个元素分别是T1和T2 ...Tn类型; 要获取元素的值需要通过tuple的成员get<Ith>(obj)进行获取(Ith是指获取在tuple中的第几个元素,请看后面具体实例)。
std::tuple<T1&> t3(ref&); // tuple的元素类型可以是一个引用
std::make_tuple(v1, v2); // 像pair一样也可以通过make_tuple进行创建一个tuple对象

tuple常用函数

为了方便您在实际开发中使用 tuple 对象,tupe 模板类提供了一个功能实用的成员函数, 头文件中也提供了一些和操作 tuple 对象相关的函数模板和类模板,如表 1 所示。

例子:

#include <iostream>
#include <tuple>int main()
{int size;//创建一个 tuple 对象存储 10 和 'x'std::tuple<int, char> mytuple(10, 'x');//计算 mytuple 存储元素的个数size = std::tuple_size<decltype(mytuple)>::value;//输出 mytuple 中存储的元素std::cout << std::get<0>(mytuple) << " " << std::get<1>(mytuple) << std::endl;//修改指定的元素std::get<0>(mytuple) = 100;std::cout << std::get<0>(mytuple) << std::endl;//使用 makde_tuple() 创建一个 tuple 对象auto bar = std::make_tuple("test", 3.1, 14);//拆解 bar 对象,分别赋值给 mystr、mydou、myintconst char* mystr = nullptr;double mydou;int myint;//使用 tie() 时,如果不想接受某个元素的值,实参可以用 std::ignore 代替std::tie(mystr, mydou, myint) = bar;//std::tie(std::ignore, std::ignore, myint) = bar;  //只接收第 3 个整形值//将 mytuple 和 bar 中的元素整合到 1 个 tuple 对象中auto mycat = std::tuple_cat(mytuple, bar);size = std::tuple_size<decltype(mycat)>::value;std::cout << size << std::endl;return 0;
}

程序执行结果为:

10 x
100
5

如何获取元素的值

获取tuple对象元素的值可以通过get(obj)方法进行获取;

Ith - 是想获取的元素在tuple对象中的位置。

obj - 是想获取tuple的对象

// tuple_size
#include <iostream>     // std::cout
#include <tuple>        // std::tuple, std::tuple_sizeint main ()
{std::tuple<int, char, double> mytuple (10, 'a', 3.14);std::cout << "mytuple has ";std::cout << std::tuple_size<decltype(mytuple)>::value;std::cout << " elements." << '\n';//获取元素std::cout << "the elements is: ";std::cout << std::get<0>(mytuple) << " ";std::cout << std::get<1>(mytuple) << " ";std::cout << std::get<2>(mytuple) << " ";std::cout << '\n';return 0;
}//输出结果:
mytuple has 3 elements.
the elements is: 10 a 3.14

c++ tuple元组相关推荐

  1. python中元组的使用_Python当中tuple元组的使用

    Python Python开发 Python语言 Python当中tuple元组的使用 python当中元组的使用比起list列表来说就简单多了!因为tuple一般是不能进行修改的,一旦进行定义则无法 ...

  2. pythontuple数据类型_Python基础教程2d–数据类型-tuple(元组)

    1定义 tuple(元组)也是一种顺序结构的数据类型,定义一个空元组的方法用英文小括号: 变量名=() t = () 定义一个包含了多个元素的元组在小括号中用逗号分隔开各个元素: 源码print('\ ...

  3. Python基础教程:list列表、tuple元组、range常用方法总结

    list 列表(数组),是可迭代对象,列表是可变的所以列表的方法都是在列表本身更改的.里面看可以放各种数据类型的数据,可存储大量数据 连接列表可以使用 + 或 extend() a = [1, 3, ...

  4. Python第三、四种数据类型——List(列表) and Tuple(元组)

    目录 一. List(列表) 1.定义一个 List 2. 对 List 进行截取(大致方法与String的截取类似) 3. 添加一个元素,使用 append() 方法 4.删除一个元素,使用 pop ...

  5. pythontuple([1、2、3)_Python 进阶之路 (三) Tuple元组使用指南

    比List更安全的数据类型 大家好,今天为大家介绍一种更为安全的Python内置数据类型:tuple(元组),以及它的基础用法 元组是什么 元组(tuple)是另一种有序的数据类型,与list比较类似 ...

  6. java 元组 getinteger_TS数据类型:从C++/Java/Python到TS看元组tuple—元组的来龙去脉...

    在C++有Java这种强类型语言中,常用的Array.List.Set ,在集合中只能是一种类型(可以复习下:<再谈Java数据结构-分析底层实现与应用注意事项). int data[] = n ...

  7. pythontuple数据类型_Python数据类型之Tuple元组实例详解

    本文实例讲述了Python数据类型之Tuple元组.分享给大家供大家参考,具体如下: tuple元组 1.概述 本质上是一种有序的集合,和列表非常的相似,列表使用[]表示,元组使用()表示. 特点:一 ...

  8. Python序列 数据类型 创建方式 Tuple元组 Str字符串 List列表 dict字典 Set集合 range,zip,map,enumerate

    Python 序列分类 数据类型 详细介绍 Python 主要数据类型: 元组Tuple, 字符串Str,列表List,字典Dict,集合Set 对比 元组Tuple 字符串Str 列表List 字典 ...

  9. Python语法-1-变量、输出、List列表、tuple元组、条件判断和循环等重要基础知识

    针对Openmv3上的Python应用(摘录带修改) 输出 1. 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: print( ...

  10. Python数据容器、list列表、tuple元组、str字符串、数据容器(序列)切片、set集合、dict字典、字符串大小比较

    数据来源 01 数据容器 为什么学习数据容器 数据容器 总结 02 列表 1)列表定义 为什么需要列表 列表的定义语法 列表的定义方式 演示 """ 演示数据容器之:li ...

最新文章

  1. P1800 software_NOI导刊2010提高(06)
  2. DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现
  3. 健康很重要 程序员应该坚持正确的坐姿工作
  4. 全网最全 Python 操作 Excel 教程,建议收藏!
  5. 时频分析:短时傅立叶变换实现(4)
  6. 北工大计算机网络基础期末考试,2013北工大计算机网络应用复习提纲整理版.doc...
  7. 用户登录功能:说简单也困难
  8. Python机器学习:线型回归法06最好的衡量线型回归法的指标RSquared
  9. Vi编辑器的基本使用方法及vi和Vim的区别【ZT】
  10. 宏、函数、宏和函数的区别
  11. Rust: codewars 的Count of positives / sum of negatives
  12. SAP BASIS ADM100 中文版 Unit 2(1)
  13. mac android studio plantuml,Mac 配置 PlantUML
  14. 对口升学考试计算机专业好考吗,2017届对口升学考试计算机专业月考三试题
  15. windows 挂载百度网盘/阿里云盘等(网盘变本地硬盘) alist + raidrive
  16. java获取经纬度_java调用高德地图api获取某个位置的经纬度
  17. 生活中软件易用性的例子_多用“举出例子”“比如说”,来进行生活中的语言交流...
  18. QT报错:Gtk-Message:Failed to load module “gail“
  19. 二见钟情之UML时序图
  20. linux修改ip,mac命令和qt中编程修改

热门文章

  1. Unity 遍历子物体
  2. python的svm库_[Python] 机器学习库 Scikit-learn之SVM
  3. js判断是否是在微信浏览器打开
  4. 撩妹、撩汉小技术---创建自己的表情包动态图GIF《python图像处理篇》
  5. srio 门铃_如何使SkyBell HD门铃静音
  6. 胡汉三又回来了:“门头沟”CEO在日本注册新公司
  7. Yandex降低内存的做法
  8. 魔兽初级上手指南快捷键
  9. 【译】Java 内存泄露的构造和检测
  10. iframe 跨越访问_js iframe跨域访问