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. 转:Linux 编译安装 Mysql5.7

    http://broqiang.com/2017/04/18/Mysql-Install-5.7.18-Linux-Compile/ 原文 Linux 编译安装 Mysql5.7 Ubuntu 下快速 ...

  2. 环境变量PATH

    一.举例 我在用户主文件夹执行命令“ls”,会在屏幕显示该文件夹下的所有文件.然而,ls的完整文件名为“/bin/ls”,按道理我不在/bin下要想执行ls命令必须输入“/bin/ls”,但我仅仅需要 ...

  3. 软件工程第六周psp

    1.psp表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 讲技术文档,分配任务 10月20日16:17 10月20日16:50 0 33分钟 准备工作 根据任务查资料 10月20 ...

  4. 实现虚拟机VMware上Centos的linux与windows互相复制与粘贴

    转自:http://blog.csdn.net/u012243115/article/details/40454063 1.打开虚拟机的菜单“虚拟机”,下拉框中会有一个“安装 VMwareTools” ...

  5. python学习摘要(4)--列表简单处理

    列表打印,访问列表元素 alist = [a,b,c,d,e] print(alist) friends_name = ['alex','bill','castle','dale'] c = 1 wh ...

  6. Mac OS安装Scrapy失败

    报错: DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be re ...

  7. RHEL 6.4(i386)安装MySQL 5.6的方法

  8. 【Linux】- Ubuntu安装nginx

    安装 执行命令: sudo apt-get install nginx 执行如图: 防火墙设置 查看防火墙状态: sudo ufw status 查看可以穿过防火墙的应用列表: sudo ufw ap ...

  9. mysql的my.cnf配置文件

    [client]port = 3306default-character-set=utf8mb4socket = /var/run/mysqld/mysql.sock# user=david# pas ...

  10. 基本数据类型(int,bool,str)

    目录: 1.int        数字类型 2.bool      布尔值 3.str    字符串类型 一.整型(int) 在python3中所有的整数都是int类型.但在python2中如果数据量 ...