tuple元组是一个固定大小不同类型的值的集合,是泛化的std::pair。我们也可以把它当作一个通用的结构体来使用,不需要创建结构体有获取结构体特征,在某些情况可以取代结构体,使程序更简洁、直观。

  tuple在C++11中使用简单,但是往往要和模板元的一些技巧结合使用。

tuple<const char *, int> tp = make_tuple("hello", ); //构造一个tuple

  这个tuple等同于结构体:

struct A
{
char *p;
int len;
};

  另外一种方法也可以创建元组:std::tie,它会创建一个元组的左值引用。

auto tp = return std::tie(, "aa", ); //tp的实际类型是std::tuple<int &, string &, int &>

  再看如何取值:

const char *data = tp.get<>();
int len = tp.get<>();

  还有std::tie也可以解包tuple来获取元组的值:

int x, y;
string s;
std::tie(x, s, y) = tp;

  通过tie解包之后,tp的三个元素会自动赋值给三个变量,如果只想解某个位置的值,可以使用std::ignore占位符来表示忽略某个位置的值。

std::tie(std::ignore, std::ignore, y) = tp; //只解第三个值

  如果要创建右值引用的元组,可以使用foward_as_tuple。

std::map<int, std::string> map; 

//创建一个类似std::tuple<int &&, std::string &&>的tuple
map.emplace(std::foward_as_tuple(, std::string(, 'a')));

  还可以通过tuple_cat来连接多个tuple:

std::tuple<int, std::string, float> t1(, "test", 30.21);

int n = ;
auto t2 = std::tuple_cat(t1, std::make_pair("foo", "bar"), t1, std::tie(n)); n = ;

  打印t2的值:

, test, 30.21,foo, bar, , test, 30.21, 

  tuple虽然可以替代简单的结构体,但是如果三个以上字段的结构体会导致可读性降低,到处都是std::get<N>(tuple),导致代码混乱,可维护性和可读性很低。

C11简洁之道:tupe元祖的更多相关文章

  1. C11简洁之道:类型推导

    1.  概述 C++11里面引入了auto和decltype关键字来实现类型推导,通过这两个关键字不仅能方便的获取复杂的类型,还能简化书写,提高编码效率. 2.  auto 2.1 auto关键字的新 ...

  2. C11简洁之道:lambda表达式

    1.  定义 lambda表达式是C++11非常重要也是很常用的特性之一,来源于函数式编程的概念,也是现代编程语言的一个特点.它有如下特点: 声明式编程风格:就地匿名定义目标函数或者函数,不需要额外写 ...

  3. C11简洁之道:函数绑定

    1.  可调用对象 在C++中,有“可调用对象”这么个概念,那么什么是调用对象呢?有哪些情况?我们来看看: 函数指针: 具有operator()成员函数的类对象(仿函数): 可以被转换为函数指针的类对 ...

  4. C11简洁之道:循环的改善

    1.  for循环的新用法 在C++98/03中,通过for循环对一个容器进行遍历,一般有两种方法,常规的for循环,或者使用<algorithm>中的for_each方法. for循环遍 ...

  5. C11简洁之道:初始化改进

    1.  C++98/03初始化 我们先来总结一下C++98/03的各种不同的初始化情况: //普通数组 ] = {, , }; //POD(plain old data) struct A { int ...

  6. C11简洁之道:模板改进

    1.  右尖括号 我们在C++98/03中使用泛型编程的时候,经常遇到“>>”被当作右移操作符,而不是模板参数的结尾.假如我们有如下代码: template <typename T& ...

  7. Day03(黑客成长日记)------>元祖及列表的增减改查

    #昨日作业解析: # s = 'sadagwa'# i = 0# while i < len(s):# s1 = s[i]# print(s1)# i += 1# while使用技巧,先找递增变 ...

  8. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

  9. 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuq ...

随机推荐

  1. Thunder团队第五周 - Scrum会议4

    Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:李传康 工作照片: 邹双黛同学在拍照,所以不在照片内. 参会成员: 王航:http://www.cnblog ...

  2. 【Docker 命令】- create命令

    docker create :创建一个新的容器但不启动它 语法 docker create [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS同run命令 实例 使用 ...

  3. Shell脚本查看linux系统性能瓶颈

    脚本目的:分析系统资源性能瓶颈 脚本功能: 1.查看CPU利用率与负载(top.vmstat.sar) 2.查看磁盘.Inode利用率与I/O负载(df.iostat.iotop.sar.dstat) ...

  4. 关闭或者开启apache的目录浏览

    为了安全或者方便需要关闭或者开启apache的目录浏览   关闭目录浏览    修改http.conf 文件    Options Indexes FollowSymLinks     改为      ...

  5. 【问题解决】Project facet Java version 1.7 (或者1.8)is not supported.

    在移植eclipse项目时,如果遇到 “Project facet Java version 1.7 is not supported.” 项目中的jdk1.7不支持.说明项目是其他版本jdk编译的, ...

  6. WebService部署服务器调试时提示 “测试窗体只能用于来自本地计算机的请求”解决方法

    原因:没有开启服务器访问权限! 解决方法: 在web.config的<system.web></system.web>中加入如下配置节内容即可解决 <webService ...

  7. Delphi中Sender对象的知识

    Sender是一个TObject类型的参数,它告诉Delphi哪个控件接收这个事件并调用相应的处理过程.你可以编写一个单一的事件处理句柄,通过Sender参数和IF…THEN…语句或者CASE语句配合 ...

  8. django_filters实现搜索

    定义model # models.py class Product(models.Model): name = models.CharField(max_length=255) author = mo ...

  9. (转)java +libsvm 安装与测试:

    libsvm 用SVM实现简单线性分类  (转自:http://www.cnblogs.com/freedomshe/archive/2012/10/09/2717356.html) 0. 下载lib ...

  10. [洛谷P5169]xtq的异或和

    题目大意:给你一张$n(n\leqslant10^5)$个点$m(m\leqslant3\times10^5)$条边的无向图,每条边有一个权值,$q(q\leqslant2^{18})$次询问,每次询 ...