C++11新的数据结构tuple

Tuple简介

tuple是C++ 11新的标准库之一,其表示N元数组,它相当于有N个成员的结构体,只不过这个结构体的成员都是匿名的。tuple是类似于pair的模板,tuple像是pair的泛化版本,pair只能存放两个成员,而tuple则可以多个成员,相同的是,pair和tuple都允许其成员的类型不一样。

tuple的用途

tuple的最常见的用途就是作为函数的返回值,利用它,可以实现函数返回多个值。(虽然C++通过结构体也可以实现返回多个值得能力,但是相对tuple来说会更繁琐一些。)

tuple的使用

定义tuple

tuple<int,double,string> testtuple1;//新建tuple类型
tuple<int,double,string> testtuple2(1,2.0,"test");//新建tuple类型的变量,其类型为tuple<int,double,string>
auto testtuple3=make_tuple("test2",123,3.14);//通过初值来初始化tuple,其类型从初值的类型中推断。

访问tuple值

与pair采用first和second来获取元素不同,因为tuple的元素个数是不固定的,所以不能用这种方式,tuple的成员都是未命名的,要访问一个tuple成员,需要使用名为get的标准库函数模板,既然是函数模板,就需要制定它的模板实参,

需要注意的是,get< n>(type)中的n需要时常量表达式,而不能是变量。

auto str=get<0>(testtuple3);//访问第一个元素,注意从0开始,
auto int_v=get<1>(testtuple3);//访问第二个元素。
get<2>(testtuple3)=2.0;//更改第三个元素的值。

tuple辅助函数

获取tuple的元素个数的方法

size_t sz=tupe_size<testtuple3>::value;//返回3

tupe_size< tupletype >::value 是一个类模板。

获取tuple类型第i个元素的数据类型:

// tuple_element<i,tupletype>::type 是类模板,返回第i个元素的数据类型。
cout<<tuple_element<i,tupletest3>::type<<endl;

关系运算符

两个tuple变量可以直接进行比较大小,但是也有前提的。其需要满足两个条件:

1. 两个tuple具有相同数量的成员数目。

2. 两个tuple的每对成员使用==运算符都是合法的(相等与否),如果是关系运算符,则每对成员的<是合法的。

bool b=(testtuple1==testtuple2);
bool b=(testtuple2<testtuple3);

另外,由于tuple定义了< 和 ==运算符,那么我们就可以将tuple系列传给排序算法。并且在无序容器中,可以将tuple变量作为关键字类型。

利用tuple使函数返回多个值

tuple<int,double,string> get_tuple()
{
    tuple<int,double,string> tp;
    ...
    return tp;
}
auto tp=get_tuple();
cout<<get<0>(tp)<<get<1>(tp)<<get<2>(tp)<<endl;

参考材料:《C++ primer 5th》

时间: 2024-10-09 06:05:46

C++11新的数据结构tuple的相关文章

C++11 新特性之 tuple

我们在C++中都用过pair.pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.pair可以使用make_pair构造 pair<int, string> p = make_pair(1, "a1"); 如果传入的参数为多个,那么就需要嵌套pair,如下代码 #include <iostream> #include <map> using namespace std; int main() { //<int, string,

【C++11】30分钟了解C++11新特性

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decl

Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以大大简化我们的编程工作.auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响.另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配.如果没有auto关键字 写个迭代器要写很长长,这也算是节省了我们的脑细胞吧,~~~~(>_<)~~~~ !! auto a; /

9秒学院学C++11新特性

9秒学院C++11新特性学习笔记 分类: C/C++ 最近学习了C++11的新特性,将学习内容整理下来以巩固记忆,C++11的新特性,可以分为两部分,第一部分是C++11核心语言的特性,第二部分是STL标准库的新特性.学习C++11主要参考了wiki上的一篇文章,在介绍右值引用的时候还参考了MSDN上一篇文章,由于这两篇文章写的时间比较早,和实际有些出入,我的开发环境是win8,vs2012,很多C++11特性还没支持,所以只整理了vs2012已经支持了的特性. 第一部分:核心语言的特性 一.

boost数据结构tuple

boost数据结构tuple tuple(元组)定义了一个有固定数目元素的容器,其中每个元素类型可以不相同,这与其它容器有着本质的区别!vector和array虽然可以容纳很多元素,但是元素的类型必须一致;tuple很有用,它是pair的泛化,可以从函数返回任意数量的值,也可以代替struct组合数据;boost.tuple使用库的方式为C++增加了这种很有用的数据结构,已被纳入C++ 11 TR1标准草案. 标准库中的pair是tuple的特例,即2-tuple(仅能持有两个成员的元组);tu

COCOS2D-X 3.0新的数据结构

基础数据结构在游戏开发中至关重要,可能每一帧某个逻辑需要从一个数组中查找,删除,添加数据,或者从一个字典中快速存/取一个值,游戏引擎本身也要对UI树进行遍历,排序等操作.基础数据的操作速度影响着程序的性能,而基础数据的使用方法则影响着开发效率.当然我们应该尽量避免游戏中每一帧频繁的迭代和查找计算,应尽可能地将结果缓存起来. C++标准库已经提供了数组(std::vector),字典(std::map)等比较优秀的基础数据结构,然而它们不支持Cocos2d-x的内存管理方式(关于Cocos2d-x

[转]30分钟了解C++11新特性

新的关键字 autoC++11中引入auto第一种作用是为了自动类型推导auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以大大简化我们的编程工作.auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响.另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配.如果没有auto关键字 写个迭代器要写很长长,这也算是节省了我们的脑细胞吧,~~~~(>_<)~~~~ !! [html] view

C++11 新特性之 变长参数模板

template <typename ... ARGS> void fun(ARGS ... args) 首先明确几个概念 1,模板参数包(template parameter pack):它指模板参数位置上的变长参数,例如上面例子中的ARGS 2,函数参数包(function parameter pack):它指函数参数位置上的变长参数,例如上面例子中的args 一般情况下 参数包必须在最后面,例如: template <typename T, typename ... Args>

[C++11新特性]第二篇

0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(int count, ...) { va_list ap; double sum=0; va_start(ap,count); for(int i=0;i<count;i++) sum+=va_arg(ap,double); va_end(ap); return sum; } int main() { p