浅析C++元组tuple类型

目录
  • 介绍
  • tuple的定义及初始化
  • tuple的使用
    • 成员访问
    • 获取tuple信息
    • 拼接tuple
    • 交换tuple
    • tuple解包
    • tuple比较
    • tuple遍历
  • tuple开发时的应用

介绍

元组tuple是C++的一个模板,不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员。

每个tuple类型的成员个数是一定的,但是不同的tuple成员个数可以不同。

tuple的定义及初始化

使用tuple要引入tuple头文件

#include <tuple>

tuple定义以及初始化(我们这里以成员类型为int、string、vector为例子)

tuple<int,string,vector<int>> test{1,"hello,world",{4,5,6}};

当然也可以使用它的构造函数进行初始化

tuple<int, string,vector<int>> test(1,"hello,world",{4,5,6});

存在这种情况,表面上看起来没有进行任何初始化操作,但实际上利用了不带参数的默认构造函数

tuple<size_t, size_t> test;	//每个成员的值为0

当然如果你这样定义后,又想对test的初始值所作更改,可以这样写,如下所示。(实际上现在的test不是原来的test,它被你新创建的tuple对象所替代了,严格意义来讲并不算是初始化)

tuple<size_t, size_t> test;	//每个成员的值为0
test = tuple<size_t, size_t>(1,2);	//第一个成员的值为1,第二个成员的值为2

另外标准库定义了make_tuple函数来生成tuple对象,我们可以用auto关键字来推测生成的tuple的类型

auto test2 = make_tuple(3.14,"wasd");

如果要添加一个vector作为成员,则情况如下

//错误写法
auto test2 = make_tuple(3.14,"wasd",{ 3,4,5 });
//正确写法
vector<int> nums = { 3,4,5 };
auto test2 = make_tuple(3.14,"wasd",nums);

tuple的使用

成员访问

说起tuple的使用,最能直接想到的自然是对tuple的访问了。

在C++标准库里,有一个名为get的函数模板。为了使用get,我们必须指定一个显式模板实参来指示访问的第几个成员,并在函数参数中给予它一个tuple对象。

tuple<int, string, vector<int>> test{ 1,"hello,world",{4,5,6} };
cout << get<0>(test) << endl;		//打印test第一个成员,其类型为int
cout << get<1>(test) << endl;		//打印test第二个成员,其类型为string
cout << get<2>(test)[0] << endl;	//打印test第三个成员vector<int>的第一个元素

下面是返回结果

1
hello,world
4

获取tuple信息

可用以下方法获取tuple元素个数

tuple<int, double, vector<string>> test{ 1,1.23,{"123","456"}};
//获取tuple成员个数
size_t num = tuple_size<decltype(test)>::value;
//利用tuple某个成员类型来声明变量(以第0个成员为例)
tuple_element<0, decltype(test)>::type n = get<0>(test);

拼接tuple

tuple<int, int, int> test(1,2,3);
tuple<int, int, int> test2(4,5,6);
tuple<int, int, int> test3(7,8,9);
//拼接
auto new_tup = tuple_cat(test, test2, test3);

交换tuple

tuple<int, int, int> test(1,2,3);
tuple<int, int, int> test2(4,5,6);
//交换
test.swap(test2);

tuple解包

tuple使用tie方法进行解包,tie的参数个数与tuple成员个数一致,否则要用ignore占位

tuple<int,int> test{2,8};
tuple<int,int> test2{2,8,6};
int a, b;
//解包
tie(a, b) = test;
//ignore占位的情况
tie(a, b, ignore) = test2;

tuple比较

当两个tuple具有相同数目的成员,且对应成员类型可比较的时候,tuple比较才合法

//有如下四个tuple
tuple<string, string> test{"1","2"};
tuple<int, int, int> test2{ 1,2,3 };
tuple<int,int> test3{1,2};
tuple<int, int> test4{ 4,5 };
test == test2;	//报错,string与int类型不能比较
test2 < test3;	//报错,test2与test3成员数量不同
test3 < test4;	//正确,该语句值为True

tuple遍历

tuple没有迭代器,其遍历非常麻烦,其设计目的也不在于此(如果项目开发过程中要对某一数据结构进行遍历该数据结构应尽量避免为tuple类型,完全可以用list代替)

但此处还是给出遍历的方法(不推荐使用)

本方法来自C++Tuple元组的详细用法 - 知乎 (zhihu.com)

#include <iostream>
#include <tuple>
#include <array>
#include <utility>
using namespace std;
template<class Tuple, size_t N>
struct PrintTuple
{
	static void Printf(const Tuple& Value)
	{
		PrintTuple<Tuple, N - 1>::Printf(Value);
		cout << "," << get<N - 1>(Value);
	}
};
template<class Tuple>
struct PrintTuple<Tuple, 1>
{
	static void Printf(const Tuple& Value)
	{
	     cout << get<0>(Value);
	}
};
template<class... Args>
void PrintfMyTuple(const tuple<Args...>& vlaue)
{
      PrintTuple<decltype(vlaue), sizeof...(Args)>::Printf(vlaue);
}
int main()
{
	tuple<int, int, int, int> a(2, 3, 1, 4);
	PrintfMyTuple(a);
	system("pause");

	return 0;
}

tuple开发时的应用

在项目开发时,如果我们想让一个函数返回多个不同类型的值的话可以使用tuple。

到此这篇关于C++元组tuple类型的文章就介绍到这了,更多相关C++元组tuple类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    1,元组简介 tuple是一个固定大小的不同类型值的集合,是泛化的std::pair.我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观.std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员,因此在需要保存3个及以上的数据时就需要使用tuple元组了. tuple(元组)在c++11中开始引用的.tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于

  • C++11新特性std::make_tuple的使用

    std::tuple是C++ 11中引入的一个非常有用的结构,以前我们要返回一个包含不同数据类型的返回值,一般都需要自定义一个结构体或者通过函数的参数来返回,现在std::tuple就可以帮我们搞定. 1.引用头文件 #include <tuple> 2. Tuple初始化 std::tuple的初始化可以通过构造函数实现. // Creating and Initializing a tuple std::tuple<int, double, std::string> resul

  • C++ STL 内 std::{bind/tuple/function} 简单实现

    基本逻辑思考 首先是实现 function,这个比较简单,重载 operator() 就好,这里只实现对函数指针的包装 其次是实现 tuple,这个会比较绕,通过模板取第一个参数,然后用剩下的参数继续生成  tuple并继承,是一种递归的思想 有了 tuple 就要有 get(),这个就更比较绕了,首先是需要类似的方式实现获得 tuple 的值类型与元组类型,然后通过强制类型转换,获取对应的层级的 value 接下来是 bind,首先要解决的就是如何保存创建时的参数列表,这里就用到 tuple

  • 浅析C++标准库元组(tuple)源码

    一.什么是元组 元组不是什么新鲜东西,在数学.python语言还有我们今天要说的C++都有元组. 简单地说,元组就是一组东西,例如,在讲代数拓扑的时候,经常把拓扑空间X和其中一点x作为一个偶对(X, x),这其实就是个元组,点的坐标也可以看成一个元组.C++中的元组(tuple)是这个样子的: std::tuple<int, std::string> tu{ 2,"12iop" }; 一个tuple可以包含不同类型的成员,例如上面的tu包含一个int和一个字符串. 二.用法

  • C++11新特性std::tuple的使用方法

    1. 引入头文件 #include <tuple> 2. std::tuple初始化 std::tuple<int, std::string, float> t1(10, "Test", 3.14); 这里要注意,不是所有的C++ 11编译器都支持copy-list-initialization的方式.如下代码所示. std::tuple<int, int> foo_tuple() { return {1, -1}; // Error until N

  • 浅析C++元组tuple类型

    目录 介绍 tuple的定义及初始化 tuple的使用 成员访问 获取tuple信息 拼接tuple 交换tuple tuple解包 tuple比较 tuple遍历 tuple开发时的应用 介绍 元组tuple是C++的一个模板,不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员. 每个tuple类型的成员个数是一定的,但是不同的tuple成员个数可以不同. tuple的定义及初始化 使用tuple要引入tuple头文件 #include <tuple> tuple定

  • python中列表(list)和元组(tuple)的深入讲解

    前言 在我们实际开发中,经常需要将一组数据存储起来,以便使用.如果学习了其他的语言可能知道数组(Array)这个数据结构,它就可以将多个数据进行存储,访问数据可以通过数组下标的方式,的进行获取.如果你是python开发者,那么可以使用更加灵活的列表(list)和元组(tuple),来进行数据储存.下面我们先简单了解下列表和元组的基本使用. 列表 列表是动态的,长度可以改变,可以随意增加,修改或删除元素. 初始化列表 a = list() b = [] # 可以通过range快速创建list c

  • python学习笔记之列表(list)与元组(tuple)详解

    前言 最近重新再看python的基础知识,感觉自己还是对于这些知识很陌生,需要用的时候还是需要翻书查阅,还是先注重基础吧--我要重新把python的教程阅读一遍,把以前自己忽略的部分学习,加强练习和记忆. 现在读到了列表(list).元组(tuple).集合(set)和字典(dict)四种在python内置的重要的数据结构.我只是想记录一下列表(list)和元组(tuple)比较容易搞混的地方和阐述一遍列表(list)和元组(tuple)比较常用的一些方法. 列表(list)与元组(tuple)

  • Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】

    本文实例讲述了Python元组 tuple的概念与基本操作.分享给大家供大家参考,具体如下: 元组 tuple 元组 tuple的定义 元组的创建 元组的元素访问和计数 1. 元组的元素不能修改 2. 元组的元素访问和列表一样,只不过返回的仍然是元组对象. 3. 列表关于排序的方法 list.sorted()是修改原列表对象,元组没有该方法.如果要对元组排 zip 生成器推导式创建元组 元组总结 元组 tuple的定义 列表属于可变序列,可以任意修改列表中的元素.元组属于不可变序列,不能修改元组

  • 简单了解python元组tuple相关原理

    这篇文章主要介绍了简单了解python元组tuple相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 元组tuple和列表List类似,元组有如下特点: 1.由一个或者多个数据构成,数据的类型可以不相同也可以相同: 2.元组中的数据需要写在()中括号内部,数据与数据之间用逗号隔开: 3.元组是一个有序的集合,下标索引默认重 0 开始,和字符串类似: 4.元组的数据不能被修改 元组 元组其实也称为只读列表,列表支持的函数元组同样也支持,唯一

  • Python数据类型中的元组Tuple

    目录 一.定义 二.合并.重复与删除 三.元组转换 四.元组中的方法 一.定义 元组可以理解为一个只读列表,用()来标识. 定义一个空元组变量 = () 但是如果元组中只有一个元素时,是元组还是其他数据类型呢?让我们来验证一下. tuple_1 = (1) print(type(tuple_1)) tuple_2 = ("hello") print(type(tuple_2)) 以上的数据类型并不是元组,要表达只有一个元素的元组定义为变量 = (元素1,),让我们来验证一下: tupl

  • Python学习笔记之字典,元组,布尔类型和读写文件

    目录 1.字典dict 1.1列表和字典的区别 1.2字典示例 1.3练习:写中国省份与省份缩写对应的字母代码 2.元组tuple 3.布尔类型bool 4.读写文件 4.1用命令做一个编辑器 4.2练习写类似的脚本 4.3用一个target.write()来打印line1.line2.line3 4.4Q&A 1.为什么我们需要给open多赋予一个’w’参数 2.如果你用w模式打开文件,那么你还需要target.truncate()吗 总结 1.字典dict 不同于列表只能用数字获取数据,字典

  • 一文搞懂Python中列表List和元组Tuple的使用

    目录 列表 List 列表是有序的 列表可以包含任意对象 通过索引访问列表元素 列表嵌套 列表可变 元组 Tuple 定义和使用元组 元素对比列表的优点 元组分配.打包和解包 List 与 Tuple 的区别 列表 List 列表是任意对象的集合,在 Python 中通过逗号分隔的对象序列括在方括号 ( [] ) 中 people_list = ['曹操', '曹丕', '甄姫', '蔡文姫'] print(people_list) ['曹操', '曹丕', '甄姫', '蔡文姫'] peopl

  • 浅析java中String类型中“==”与“equal”的区别

    一.前言 1.1.首先很多人都知道,String中用"=="比较的是地址,用equals比较的是内容,很多人对此用的是记忆法,通过记忆来加强此的引用,但是其真正的原理其实并不难,当我们真正明白其为什么的时候,用起来也会更加灵活,更加有底气(形容得不太好,朋友别见怪): 二相关知识的准备 类型常量池 运行时常量池 字符串常量池 我们今天讨论的主题是当然是字符串常量池: 为什么在这要把另外两个常量池拿出说一下呢,首先小生我在网上或者cnds上看到很多人在争论字符串常量池是存在与方法区还是堆

  • Python的 元组(Tuple)详解

    目录 Python3的 元组(Tuple) 元组运算符 元组索引,截取 元组内置函数 总结 Python3的 元组(Tuple) Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用: 元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等. 可以对元组进行连接组合,但是不能修改,删除.

随机推荐