tuple 类型

写在前面

STL当中的tuple类型

主要内容

起因

用过python等动态语言的人都应该知道,这类的语言函数都可以返回多个值,每个值可以是不同的类型的对象。同样Java和python当中都有可以装载不同类型的变长数组存在,Java当中是容器Array,python当中是列表list。
在c++当中没有提供一个方便的数据结构可以像这样实现不同类型的对象的打包。唯一能够实现的操作也是通过struct定义不同的类型的成员进行打包,这样在处理不同的类型的时候都要写上一遍不同的定义使用起来确实麻烦。

tuple

所以c++标准库在c++11里添加了tuple这样一个类模板,通过它可以进行不同类型的数据的打包从而可以方便的实现函数的多返回值。

下面是对于tuple的使用实例:

#include <iostream>
#include <tuple>
#include <vector>
#include <string>
using namespace std;
int main()
{
    tuple<string, unsigned int, double> Zhouz;
    Zhouz = make_tuple("zz", 24, 60.0);

    //或者利用typedef来简化
    typedef tuple<string, unsigned int, double> Human;

    Human Yic("zz", 24, 60.0);

    vector<Human> vecHuman;
    vecHuman.push_back(Zhouz);
    vecHuman.push_back(Yic);

    //获取tuple数据组变量zhouz中的第一个数据名字
    cout<<"姓名:"<<get<0>(Zhouz)<<endl;

    get<1>(Zhouz) += 1;

    cout<<"年龄:"<<get<1>(Zhouz)<<endl;

    cout<<"体重:"<<get<2>(Zhouz)<<endl;

    return 0;
}

tuple支持的操作:

可以通过模板参数的指定定义一个tuple类型的对象。
也可以方便的使用make_tuple根据传入的对象的类型进行直接的创建。这个函数自然是个模板函数使用了参数的类型推导机制。
可以通过模板函数get获取tuple对象第i个元素的引用。
通过两个模板类可以获取tuple对象的元素的个数以及第i个元素的类型。
通过c++11的decltype可以获取某个tuple对象的实际类型。

C++ 11中引入的tuple是一个N元组。它相当于有N个成员的结构体,只不过这个结构体的成员都是匿名的。tuple中有两个特殊的函数,一个是head(),用于获取第一个成员的值,另一个是tail(),用于获取剩下所有成员的值,tail()本身又是一个tuple。这样,如果我们想取tuple中第二个成员的值,则可以先取tail()的值,再取tail()的head()的值。当然,这样使用的话比较麻烦,所以C++ 11提供了get函数通过索引来获取tuple中某个成员的值。另外,通过make_tuple可以很方便地构造一个tuple对象。


tuple是如何实现的?

前面说过,tuple是一个N元组,而N的个数是没有限制的,也就是说,tuple可以包含0个、1个、2个或更多的元素,每个元素的类型则通过模板参数指定。那么,tuple是如何做到这些的呢?答案是可变参数模板。
虽然tuple已近可以实现不同的数据类型的对象的打包,但是还是不能动态的往里头添加不同的对象,因为这个tuple的类型已近定了无法再给这个对象添加新的成员。

猜你喜欢

转载自blog.csdn.net/zhc_24/article/details/82084741