C++ 元组 tuple的基本使用

时间:2021-07-12 23:11:18

参考原文地址:

https://blog.csdn.net/chayalikemei/article/details/51105630

先上tuple使用的测试程序:

    // 元组访问
    std::tuple<int, int, vector<int>> tupleTest(1, 4, { 5,6,7,8 });

    // 元组个数
    int tupleTestSize = std::tuple_size<decltype(tupleTest)>::value;
    cout << "tuple size is : " << tupleTestSize << endl;

    auto first = get<0>(tupleTest);
    cout << "first value is : " << first << endl;

    auto second = get<1>(tupleTest);
    cout << "second value is : " << second << endl;

    auto third = get<2>(tupleTest);
    for (const auto & iter : third)
    {
        cout << "third value is : " << iter << endl;
    }

    auto catTupleTest = make_tuple(1, 4);
    // 元组合并
    auto newTuple = std::tuple_cat(catTupleTest, tupleTest);
    int newTupleSize = std::tuple_size<decltype(newTuple)>::value;
    cout << "after cat, new tuple size is : " << newTupleSize << endl;

运行结果:

        tuple size is : 3
        first value is : 1
        second value is : 4
        third value is : 5
        third value is : 6
        third value is : 7
        third value is : 8
        after cat, new tuple size is : 5

了解tuple

  • tuple是模板,tuple所有成员都是public的
  • 使用tuple的相关操作,需要包含头文件。
  • 希望将数据组合成单一对象时,使用tuple非常有用。(快而随意的数据结构)
  • 一个tuple可以有任意数量的成员,tuple的成员类型也不相同。
  • 一个确定的tuple类型的成员数目是固定的,意味着不能有添加和删除能够改变成员数目的操作。

定义和初始化tuple

  • 1.当我们定义一个tuple时,需要指出每个成员的类型。创建tuple对象时,可以使用tuple的默认构造函数,该默认构造函数对每个成员进行 值初始化
tuple<int,float,size_t> threet; 
  • 2.初始化tuple:tuple的构造函数是 explicit 的,因此必须使用 直接初始化
tuple<size_t,size_t> tup={1,2,3};//错误
tuple<string,vector<double>,int,list<int>> someVal("tuple",{2.14,3.15},100,{1,2,3})//正确
tuple<int,int,double> some{2,3,3.15};//这样也行,注意与上面的括号
  • 3.make_tuple函数:用来生成tuple对象,用初始值的类型推断tuple类型
auto itme=make_tuple("string",3,20.01);
//item的类型为tuple<const char*,int,double>

访问tuple的成员

  • 1.get标准库模板:为了使用get获取tuple的成员,我们必须指定一个 显示模板实参(在<>里,<>里面的值必须是常量表达式),表示访问第几个成员。还需要传递给get一个tuple对象,返回指定成员的 引用。
    get(m):m如果是一个左值,该表达式返回左值引用,否则是一个右值引用
auto itme = make_tuple("string", 3, 20.01);
auto book = get<1>(itme);//返回tuple对象item的第二个成员,从0开始计数
  • 2.类模板tuple_size:查询tuple成员数量。
    使用tuple_size需要知道tuple对象类型(类型推导使用 decltyple),tuple_size有一个public static的数据成员value,表示给定tuple中的成员数量。
auto itme = make_tuple("string", 3, 20.01);
auto sz = tuple_size<decltype(itme)>::value;//sz为3
  • 3.类模板tuple_element:查询tuple成员的类型。tuple_element接受一个索引(从0开始)和一个tuple对象类型。tuple_element有一个public的成员type,表示给定tuple类型中指定成员的类型
auto itme = make_tuple("string", 3, 20.01);
tuple_element<1, decltype(itme)>::type ctype;//ctype的类型为int

关系和相等运算符

  • 条件:只有2个tuple具有相同数量的成员,才可以比较。比较时,每对成员必须是合法的,简单来说就是2个tuple成员类型应该相同。
  • 高级用法:从函数返回多个值。由于tuple定义了<和==运算符,因此还可以将tuple序列传递给算法,并且可以在无序容器中将tuple作为关键字类型。