boost::tuple 深入学习解说
#include<iostream>
#include<string>
#include<boost/tuple/tuple.hpp>
#include<boost/tuple/tuple_io.hpp>
#include <boost/tuple/tuple_comparison.hpp>
using namespace std;
int main(){
//boost::tuple 扩展了 C++ 的数据类型 std::pair 用以储存多个而不仅仅是两个值。
//除了 boost::tuple。 这一章还涵盖了类 boost::any 和 boost::variant 以储存那些不确定类型的值。
当中 boost::any 类型的变量使用起来就像弱类型语言中的变量一样灵活。 还有一方面, boost::variant 类型的变量能够储存一些提前定义的数据类型, 就像我们用 union 时候一样。
typedef boost::tuple<std::string, std::string> person1;
person1 p1("Boris", "Schaeling");
cout << p1 << std::endl;
//就像 std::pair 有辅助函数 std::make_pair() 一样, 一个元组也能够用它的辅助函数 boost::make_tuple() 来创建。
std::cout << boost::make_tuple("Boris", "Schaeling", 43) << std::endl;
//一个元组也能够存储引用类型的值。
std::string s = "Boris";
std::cout << boost::make_tuple(boost::ref(s), "Schaeling", 43) << std::endl;
//由于 "Schaeling" 和 43 是按值传递的,所以就直接存储在了元组中。 与他们不同的是: person 的第一个元素是一个指向 s 的引用。 Boost.Ref 中的 boost::ref() 就是用来创建这种引用的。
相对的。 要创建一个常量的引用的时候, 你须要使用 boost::cref() 。
//在学习了创建元组的方法之后, 让我们来了解一下訪问元组中元素的方式。
std::pair 仅仅包括两个元素。 故能够使用属性 first 和 second 来訪问当中的元素。
但元组能够包括无限多个元素, 显然。 我们须要用还有一种方式来解决訪问的问题。
typedef boost::tuple<std::string, std::string, int> person2;
person2 p2 = boost::make_tuple("Boris", "Schaeling", 43);
std::cout << p2.get<0>() << std::endl;
std::cout << boost::get<0>(p2) << std::endl;
//我们能够用两种方式来訪问元组中的元素: 使用成员函数 get() , 或者将元组传给一个独立的函数 boost::get() 。 使用这两种方式时, 元素的索引值都是通过模板參数来指定的。
样例中就分别使用了这两种方式来訪问 p 中的第一个元素。
因此, Boris 会被输出两次。
//另外。 对于索引值合法性的检查会在编译期执行, 故訪问非法的索引值会引起编译期错误而不是执行时的错误。
//对于元组中元素的改动。 你相同能够使用 get() 和 boost::get() 函数。
typedef boost::tuple<std::string, std::string, int> person3;
person3 p3 = boost::make_tuple("Boris", "Schaeling", 43);
p3.get<1>() = "Becker";
std::cout << p3 << std::endl;
//get() 和 boost::get() 都会返回一个引用值。 样例中改动了 lastname 之后将会输出: (Boris Becker 43) 。
//Boost.Tuple 除了重载了流操作运算符以外, 还为我们提供了比較运算符。 为了使用它们, 你必需要包括对应的头文件: boost/tuple/tuple_comparison.hpp 。
typedef boost::tuple<std::string, std::string, int> person4;
person4 p4 = boost::make_tuple("Boris", "Schaeling", 43);
person4 p5 = boost::make_tuple("Boris", "Becker", 43);
std::cout << (p4 != p5) << std::endl;
//上面的样例将会输出 1 由于两个元组 p1 和 p2 是不同的。
}
编译后输出:
(Boris Schaeling)
(Boris Schaeling 43)
(Boris Schaeling 43)
Boris
Boris
(Boris Becker 43)
1
boost::tuple 深入学习解说的更多相关文章
- 【Todo】Boost安装与学习
现在这里找下载包 http://sourceforge.net/projects/boost 我找的是 1_62_0 下面是从公司wiki上找到的一个说明. boost & thrift安装步 ...
- boost tuple
boost::tuple is a generalized version of std::pair. While std::pair can only store exactly two value ...
- Boost线程库学习笔记
一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...
- boost asio io_service学习笔记
构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionSta ...
- boost timer代码学习笔记
socket连接中需要判断超时 所以这几天看了看boost中计时器的文档和示例 一共有五个例子 从简单的同步等待到异步调用超时处理 先看第一个例子 // timer1.cpp: 定义控制台应用程序的入 ...
- Boost.Coroutine2:学习使用Coroutine(协程)
function(函数)routine(例程)coroutine (协程) 函数,例程以及协程都是指一系列的操作的集合. 函数(有返回值)以及例程(没有返回值)也被称作subroutine(子例程), ...
- 初探boost之noncopyable学习笔记
noncopyable 功能 同意程序轻松实现一个不可复制的类. 需包括头文件 #include<boost/noncopyable.hpp> 或 #include<boos ...
- Python tuple元组学习
1.tuple和list非常类似,但是tuple一旦初始化就不能修改 classmates = ('Michael', 'Bob', 'Tracy') 现在,classmates这个tuple不能变了 ...
- std::locale与boost::locale的学习
1. 什么是facet, locale facet ['fæsɪt]的原意,是宝石切割出来的一个平面. locale[ləʊˈkæl],表示本地化, locale the container that ...
随机推荐
- camera table表编译
mmm -j8 vendor/mediatek/proprietary/hardware/mtkcam/v1/common/paramsmgr/ 2>&1 | tee ft.lib.lo ...
- grpc vs2015编译
获取gRPC源码 gRPC是开源框架,项目代码在github上,所以首先要安装github.github安装后,在指定文件夹中,执行git命令就可以获取gRPC的所有源码. git clone ht ...
- Nginx配置指令location匹配符优先级和安全问题
使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";"号,语句块用"{}"括起来. ...
- Node.js:工具模块
ylbtech-Node.js:工具模块 1.返回顶部 1. Node.js 工具模块 在 Node.js 模块库中有很多好用的模块.接下来我们为大家介绍几种常用模块的使用: 序号 模块名 & ...
- Node.js:GET/POST请求
ylbtech-Node.js:GET/POST请求 1.返回顶部 1. Node.js GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般 ...
- Node.js:事件循环
ylbtech-Node.js:事件循环 1.返回顶部 1. Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 ...
- Hdu-2892 area 计算几何 圆与凸多边形面积交
题面 题意:有一个凸多边形岛屿,然后告诉你从高空(x,y,h)投下炸弹,爆炸半径r,飞机水平速度和重力加速度,问岛屿被炸了多少 题解:算出来岛屿落地位置,再利用圆与凸多边形面积交 #include&l ...
- Map初始化
转载至:http://blog.csdn.net/dujianxiong/article/details/54849079 第一种方法:static块初始化 public class Demo{ pr ...
- delphi 用idhttp做web页面数据抓取 注意事项
这里不讨论webbrowse方式了 .直接采用indy的 idhttp Get post 可以很方便的获取网页数据. 但如果要抓取大量数据 程序稳定运行不崩溃就不那么容易了.这几年也做了不少类似工具 ...
- java8-2-Lambda表达式
java8的lambda表达式:使得代码更加紧凑:修改方法的能力:更好的支持多核处理(并行处理函数和filter\map\reduce) 例子1: java7中,list集合排序: public st ...