浅析C++元组tuple类型

 更新时间:2022年06月14日 08:57:06   作者:CairBin  
元组tuple是C++的一个模板,不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员,今天通过本文给大家介绍C++元组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类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt界面美化之自定义qss样式表的详细步骤

    Qt界面美化之自定义qss样式表的详细步骤

    很多人应该和我一样,想做界面才接触的Qt,结果就是做不出来华丽的界面,下面这篇文章主要给大家介绍了关于Qt界面美化之自定义qss样式表的详细步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 详解Matlab如何绘制圆角半透明图例

    详解Matlab如何绘制圆角半透明图例

    目前MATLAB的legend图例是不支持圆角和半透明的,所以本文将自制实现圆角半透明图例。文中的示例代码讲解详细,需要的可以参考一下
    2022-05-05
  • C++中构造函数详解

    C++中构造函数详解

    大家好,本篇文章主要讲的是C++中构造函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • QT6实现音频可视化的示例代码

    QT6实现音频可视化的示例代码

    这篇文章主要为大家详细介绍了一个基于QT6的音频可视化Demo,文中的示例代码,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • C++使用CRT库检测内存泄漏的方法详解

    C++使用CRT库检测内存泄漏的方法详解

    内存泄漏是 C/C++ 应用程序中最微妙、最难以发现的 bug,存泄漏是由于之前分配的内存未能正确解除分配而导致的, 内存泄漏的检测工具有很多,CRT库,是Visual Studio 自带的,所以我们可以开箱即用,所以下面我们就来一起学习一下如何使用CRT库检测内存泄漏
    2024-06-06
  • C语言 字符串首字母转换成大写简单实例

    C语言 字符串首字母转换成大写简单实例

    这篇文章主要介绍了C语言 字符串首字母转换成大写简单实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++内存分区模型超详细讲解

    C++内存分区模型超详细讲解

    在了解内存分区之前,我们先来聊一聊为什么要进行内存分区。在进行了内存分区之后,在不同的区域存放的数据,会有不同的生命周期,从而会让程序员的编程变得更加灵活
    2022-11-11
  • 详解C语言中结构体的自引用和相互引用

    详解C语言中结构体的自引用和相互引用

    这篇文章主要介绍了C语言中结构体的自引用和相互引用,详细解析了结构体中指针的指向情况,需要的朋友可以参考下
    2016-04-04
  • C语言入门篇--充分理解操作符

    C语言入门篇--充分理解操作符

    本篇文章是基础篇,适合c语言刚入门的朋友,本文主要介绍了c语言的操作符基础理论,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • C语言编程函数指针入门精讲教程

    C语言编程函数指针入门精讲教程

    大家在C语言的学习中一定会接触指针这样一个东西,而指针也是新手路上一定要消灭的boss,如果以后还要学习Java的同学更是要注重指针的学习,希望能够有所帮助
    2021-10-10

最新评论