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

1,元组简介

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

tuple(元组)在c++11中开始引用的。tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,要揭开它神秘的面纱时又比较困难。

2,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的元素类型为引用:

std::string name;
std::tuple<string &, int> tpRef(name, 30);
// 对tpRef第一个元素赋值,同时name也被赋值 - 引用
std::get<0>(tpRef) = "Sven";

// name输出也是Sven
std::cout << "name: " << name << '\n';

3,有关tuple元素的操作

等价结构体

开篇讲过在某些时候tuple可以等同于结构体一样使用,这样既方便又快捷。如:

struct person {
 char *m_name;
 char *m_addr;
 int *m_ages;
};

//可以用tuple来表示这样的一个结构类型,作用是一样的。
std::tuple<const char *, const char *, int>

如何获取tuple元素个数

当有一个tuple对象但不知道有多少元素可以通过如下查询:

// tuple_size
#include <iostream> // std::cout
#include <tuple> // std::tuple, std::tuple_size

int 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';

 return 0;
}

//输出结果:
mytuple has 3 elements

如何获取元素的值

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

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

obj - 是想获取tuple的对象

// tuple_size
#include <iostream> // std::cout
#include <tuple> // std::tuple, std::tuple_size

int 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 

tuple不支持迭代,只能通过元素索引(或tie解包)进行获取元素的值。但是给定的索引必须是在编译器就已经给定,不能在运行期进行动态传递,否则将发生编译错误:

for(int i=0; i<3; i++)
 std::cout << std::get<i>(mytuple) << " "; //将引发编译错误

获取元素的类型

要想得到元素类型可以通过tuple_element方法获取,如有以下元组对象:

std::tuple<std::string, int> tp("Sven", 20);

// 得到第二个元素类型

std::tuple_element<1, decltype(tp)>::type ages; // ages就为int类型

ages = std::get<1>(tp);

std::cout << "ages: " << ages << '\n';

//输出结果:
ages: 20

利用tie进行解包元素的值

如同pair一样也是可以通过tie进行解包tuple的各个元素的值。如下tuple对象有4个元素,通过tie解包将会把这4个元素的值分别赋值给tie提供的4个变量中。

#include <iostream>
#include <tuple>
#include <utility>

int main(int argc, char **argv) {
 std::tuple<std::string, int, std::string, int> tp;
 tp = std::make_tuple("Sven", 25, "Shanghai", 21);

 // 定义接收变量
 std::string name;
 std::string addr;
 int ages;
 int areaCode;

 std::tie(name, ages, addr, areaCode) = tp;
 std::cout << "Output: " << '\n';
 std::cout << "name: " << name <<", ";
 std::cout << "addr: " << addr << ", ";
 std::cout << "ages: " << ages << ", ";
 std::cout << "areaCode: " << areaCode << '\n';

 return 0;
}
//输出结果:
Output:
name: Sven, addr: Shanghai, ages: 25, areaCode: 21

但有时候tuple包含的多个元素时只需要其中的一个或两个元素,如此可以通过std::ignore进行变量占位,这样将会忽略提取对应的元素。可以修改上述例程:

#include <iostream>
#include <tuple>
#include <utility>

int main(int argc, char **argv) {
 std::tuple<std::string, int, std::string, int> tp;
 tp = std::make_tuple("Sven", 25, "Shanghai", 21);

 // 定义接收变量
 std::string name;
 std::string addr;
 int ages;
 int areaCode = 110;

 std::tie(name, ages, std::ignore, std::ignore) = tp;
 std::cout << "Output: " << '\n';
 std::cout << "name: " << name <<", ";
 std::cout << "addr: " << addr << ", ";
 std::cout << "ages: " << ages << ", ";
 std::cout << "areaCode: " << areaCode << '\n';

 return 0;
}

//输出结果:
Output:
name: Sven, addr: , ages: 25, areaCode: 110

tuple元素的引用

前面已经列举了将引用作为tuple的元素类型。下面通过引用搭配make_tuple()可以提取tuple的元素值,将某些变量值设给它们,并通过改变这些变量来改变tuple元素的值:

#include <iostream>
#include <tuple>
#include <functional>

int main(int argc, char **agrv) {

 std::tuple<std::string, int, float> tp1("Sven Cheng", 77, 66.1);

 std::string name;
 int weight;
 float f;

 auto tp2 = std::make_tuple(std::ref(name), std::ref(weight), std::ref(f)) = tp1;

 std::cout << "Before change: " << '\n';
 std::cout << "name: " << name << ", ";
 std::cout << "weight: " << weight << ", ";
 std::cout << "f: " << f << '\n';

 name = "Sven";
 weight = 80;
 f = 3.14;

 std::cout << "After change: " << '\n';
 std::cout << "element 1st: " << std::get<0>(tp2) << ", ";
 std::cout << "element 2nd: " << std::get<1>(tp2) << ", ";
 std::cout << "element 3rd: " << std::get<2>(tp2) << '\n';

 return 0;
}

//输出结果:
Before change:
name: Sven Cheng, weight: 77, f: 66.1
After change:
element 1st: Sven, element 2nd: 80, element 3rd: 3.14

tuple交换

tuple<int, std::string, float> t4(11, "Test", 3.14);
cout << get<0>(t3) << " " << get<0>(t4) << endl;
t3.swap(t4);
cout << get<0>(t3) << " " << get<0>(t4) << endl;

排序

bool cmp(tuple<string,int,char> a,tuple<string,int,char> b){
 return a<b;
 return get<1>(a)<get<1>(b); // 也可以按某列排序
}
main(){
 tuple<string,int,char> my_tuple[10];
 my_tuple[0] = std::make_tuple ("Pipr",42,'a');
 my_tuple[1] = std::make_tuple ("Piper",41,'a');
 my_tuple[2] = std::make_tuple ("Pper",45,'a');
 my_tuple[3] = std::make_tuple ("Pier",49,'a');
 for(int i=0;i<4;++i){
 cout << get<0>(my_tuple[i]) << " " << get<1>(my_tuple[i]) << " ";
 }
 cout << endl;
 sort(my_tuple,my_tuple+4,cmp);
 for(int i=0;i<4;++i){
 cout << get<0>(my_tuple[i]) << " " << get<1>(my_tuple[i]) << " ";
 }
 cout << endl;
}

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

(0)

相关推荐

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

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

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

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

  • Python基础数据类型tuple元组的概念与用法

    目录 元组简单介绍 声明元组 元组与列表的区别 特殊的元组 元组的简写 元组常见运算操作 索引 [ ] 取值 切片 [ : : ] 取值 运算符 + 运算符 * 关键字 in 常见函数 max(元组) 函数 min(元组) 函数 元组常见方法 index(item) count(value) 元组总结 元组简单介绍 元组是一个和列表和相似的数据类型,也是一个有序序列 两者拥有着基本相同的特性,但是也有很多不同的地方 声明元组 var = (1, 2, 3) var = ("1", &q

  • C#元组类型ValueTuple用法详解

    System.Tuple 类型是在.NET 4.0中引入的,但是有两个明显的缺点:(1) Tuple 类型是引用类型.(2) 没有构造函数支持. 为了解决这些问题,C# 7 引入了新的语言功能以及新的类型. 现在,如果您需要从函数中返回两个值的合并结果,或者把两个值合并到一个哈希表中,可以使用System.ValueTuple类型并使用一个精短的语法来构造它们: // 构建元组实例 var tpl = (1, 2); // 在字典中使用元组 var d = new Dictionary<(int

  • Python数据类型之Tuple元组实例详解

    本文实例讲述了Python数据类型之Tuple元组.分享给大家供大家参考,具体如下: tuple元组 1.概述 本质上是一种有序的集合,和列表非常的相似,列表使用[]表示,元组使用()表示. 特点:一旦初始化,就不能发生改变 2.元组的创建 格式: 元组名 = (元素1, 元素2 ,元素3,-) #创建空的元组 tuple1 = () print(tuple1) #创建带有元素的元组 tuple2 =(22, 33, 14, 109) print(tuple2) #与列表类似,元组中的元素类型可

  • Python使用list列表和tuple元组的方法

    list: Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出寝室所有室友的名字,就可以用一个list表示: roomie = ['xzl','xsy','pp'] len(roomie) 用len()函数可以获得list元素的个数: 用索引来访问list中每一个位置的元素,记得索引和数组一样是从0开始的: 当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界. 值得注意的是:如果要取最后一个

  • .net4.0中tuple元组的使用方法

    原来做一些功能时需要一个方法返回几个值,有两种方法: 1. 非常难看.难用的OUT参数: 2. 新写一个实体,太麻烦: 现在有了元组[Tuple],看看它怎么做: 复制代码 代码如下: private void TestTuple(){    var test1 = Test1();    if (test1.Item3 == "Test1") {        //TODO.......    }} private Tuple<int, int, string> Test

  • Python中的tuple元组详细介绍

    Tuple 是不可变 list. 一旦创建了一个 tuple 就不能以任何方式改变它. Tuple 与 list 的相同之处 定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号. Tuple 的元素与 list 一样按定义的次序进行排序. Tuples 的索引与 list 一样从 0 开始, 所以一个非空 tuple 的第一个元素总是 t[0]. 负数索引与 list 一样从 tuple 的尾部开始计数. 与 list 一样分片 (slice) 也可以使

  • 浅析C++元组tuple类型

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

  • Python 元组拆包示例(Tuple Unpacking)

    1.元组? 元组的特点: 相当于不可变得列表: 可用于没有字段名的记录. pythn里的元组就相当于C语言里的数组,是不可变的,但是也可以容纳不同类型的元素,也是容器的一种. >>> t = (1,2,'a','b','c') >>> t (1, 2, 'a', 'b', 'c') >>> type(t) <class 'tuple'> 元组主要有两个方法: index():获取指定元素在元组内的下标 count():统计指定元素在元组内出

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

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

随机推荐