简介

在c++ 11标准库中,加入了std::tie,在c++ 14中改进,方便使用。 其与tuple关系密切, 主要目的是方便地使用tuple。

元组 std::tuple

元组tuple,有人认为是std::pair扩展。pair只能把2个数据打包,而tuple可以打包更多的数据,虽然超过了9个时,其方式就比较搞笑了。

template<class _Ty1,class _Ty2>struct pair{    // store a pair of valuestypedef pair<_Ty1, _Ty2> _Myt;typedef _Ty1 first_type;typedef _Ty2 second_type;pair(): first(), second(){    // default construct}pair(const _Ty1& _Val1, const _Ty2& _Val2): first(_Val1), second(_Val2){   // construct from specified values}template<class _Other1,class _Other2,class = typename enable_if<is_convertible<const _Other1&, _Ty1>::value&& is_convertible<const _Other2&, _Ty2>::value,void>::type>pair(const pair<_Other1, _Other2>& _Right): first(_Right.first), second(_Right.second){ // construct from compatible pair}//......

为生成pair, c++ 提供了make_pair的快捷操作。

而tuple的定义:


template<class _This,class... _Rest>class tuple<_This, _Rest...>: private tuple<_Rest...>{    // recursive tuple definition
public:typedef _This _This_type;typedef tuple<_This, _Rest...> _Myt;typedef tuple<_Rest...> _Mybase;static const size_t _Mysize = 1 + sizeof...(_Rest);tuple(): _Mybase(),_Myfirst(){ // construct default}template<class... _Rest2>explicit tuple(_Tuple_alloc_t, _Rest2&&... _Rest_arg): _Mybase(_STD forward<_Rest2>(_Rest_arg)...),_Myfirst(allocator_arg){   // construct smuggled allocator_arg_t element}template<class... _Other,class = typename _Tuple_enable<tuple<const _Other&...>, _Myt>::type>tuple(const tuple<_Other...>& _Right): _Mybase(_Right._Get_rest()), _Myfirst(_Right._Myfirst._Val){ // construct by copying same size tuple}// ....

相应地,c++ 标准库提供了make_tuple 内联方法,快速创建tuple对象。

std::tie

一般std::tie有2个作用:

  • 创建一个std::tuple;
  • 解包标准库中的一些集合类,简化访问方法。

生成tuple

使用极为简单,可以使用构造函数,内联快捷方法。
示例:

// 定义时 初始化
std::tuple<int, double, std::string> student1 = { 1, 98.0, "David" };
// 使用构造函数
std::tuple<int, double, std::string> student2 ( 2, 99.2, "david2" );

下面的示例使用内联快捷方法。 这里还使用了新版本c++支持的类型auto , 让编译器自动判断类型 – 虽然传统的我并不喜欢-- 编译时,编译器要选择至少支持C11版本. 如果使用VS,可以看到这些设置。


在linux/macOS上,在g++ build时,指定std, 如:

g++ tuple_sample.cpp -o tuple_sample -std=c++11

代码示例:

auto student2 = std::make_tuple(11, 98, "Tom" );

使用std:tie,则也可以简单处理:

string name3 = "david3";
int id3 = 3;
double d3 = 99.3;
tuple<int, double, string>  student3 = std::tie(id3, d3, name3);

解包数据

使用std::tie 可以对一些集合类型进行解包,包括set, tuple, pair … 简化数据访问并赋值到变量。

如示例:

int id3;
string name3;
std::tie(id3, std::ignore, name3) = student3;
cout << "tie student-" << id3 << "  \t " << name3 << endl;

注意: 这里使用std:ignore跳过数据对象中不关心的数据。

输出:

tie student-3    david3

c++之 std::tie相关推荐

  1. std::tie简单介绍

    参考链接 std::tie详解 std::tie

  2. std::tuple、std::tie(可用于结构体大小比较)、std::pair用法

    1.tuple应用: 解释:是一个元组,可包含无限多不同类型变量,pair的升级版,但没有pair得成员变量first.second. 1.1.代码: // tuple example #includ ...

  3. std::tie详解

    std::tie:创建左值引用的 tuple,或将 tuple 解包为独立对象 返回值 含左值引用的 std::tuple 对象. 注意 std::tie 可用于解包 std::pair ,因为 st ...

  4. 从一个小题中的应用来体会下std::tie的便利之处

    文章目录 前言 解题过程 爬楼梯的最少成本 题目分析 DP优化 利用tie进行写法优化 std::tuple std::tuple的访问 std::tie函数中使用std::ignore占位 总结 前 ...

  5. std::tuple, std::pair, std::tie 快速掌握

    tuple是可以存异构元素的容器,比如可以在一个容器中同时存储int.string.bool等. 作为对比,vector只能存储同类型的元素.tuple可做作为struct的一种更简洁高效的替代. 使 ...

  6. std::pair std::tuple std::tie

    std::pair 固定包含两个数据,Defined in header <utility> 场景 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的m ...

  7. std::tie 创建左值引用的 tuple,或将 tuple 解包为独立对象

    说明 std::tie : 创建左值引用的 tuple,或将 tuple 解包为独立对象 可以对std::tuple以及std::pair进行解包 返回值 含左值引用的 std::tuple 对象. ...

  8. boost::tie或std::tie是啥

    简介   学boost库的时候,遇到一段代码,函数返回类型是boost::tribool 类型.代码里用了boost::tie函数,有点蒙蔽了.查资料总结如下,std也有对应的实现. 基本概念先弄清, ...

  9. C++11中std::tuple的使用

    std::tuple是类似pair的模板.每个pair的成员类型都不相同,但每个pair都恰好有两个成员.不同std::tuple类型的成员类型也不相同,但一个std::tuple可以有任意数量的成员 ...

最新文章

  1. tf.InteractiveSession()与tf.Session()
  2. 谷歌TensorFlow Lite支持Core ML
  3. 计算机课中初中一年级学生特点分析,初中信息技术说课稿:计算机的组成
  4. linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
  5. Android开发之注解式框架ButterKnife在ADT中的设置
  6. 如何创建一个最小的串口、TTY设备包括虚拟控制台,串口以及伪终端设备的驱动程序
  7. Springpath专注于思科OEM开发工作
  8. Android学习笔记--Menu菜单的使用
  9. JdbcTemplate 的使用
  10. onethink中的用户登录session签名
  11. Activity传递数据
  12. vue 插件(Sublime Text 3 常用插件以及安装方法)(转)
  13. WebServer服务器开发的基本逻辑
  14. 毫秒级超低延时直播产品实测(PRTC直播/webRTC直播)
  15. java程序猿面试问缺点怎么回答_当程序员面试被问“你的缺点是什么?”你该怎么回答?...
  16. I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之声卡驱动移植
  17. FPGA Implementation of BPSK Modulator and Demodulator
  18. SQL求和一个表之后和另一个表数据进行关联
  19. hdu 2977 Color Squares
  20. python类的使用

热门文章

  1. 数据结构之二叉树基本操作
  2. java 麻将的发牌与洗牌_JAVA程序设计(11)-----面对对象初级设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样...
  3. 《红楼梦》人物关系有多复杂?一张图帮你理清楚!
  4. 这个国家要弃用Windows操作系统?我们的国产操作系统却没什么人用
  5. 数字电视专业术语--DTV名词扫盲
  6. Android-蓝牙通信
  7. vscode python无法跳转到函数定义
  8. C# 理解Thread.Sleep()方法
  9. KCP协议:从TCP到UDP家族QUIC/KCP/ENET
  10. 环信php创建群组,群组@功能