boost::tuple 深入学习讲解
2014-05-03 02:29
330 查看
#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
#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 深入学习讲解
- 第79讲:单例深入讲解及单例背后的链式表达式学习笔记
- YOUYOU深入学习Ganglia之四(Ganglia metrics 讲解)
- mysql学习之引擎、Explain和权限的深入讲解
- 跟燕十八学习PHP-第二十八天-union用法深入讲解
- cocos2dx学习之路----第二篇(HelloWorld深入讲解)
- Github Mybatis深入学习之入门讲解
- RMI学习以及深入讲解
- 『boost』boost::tuple学习
- 机器学习教程 之 集成学习算法: 深入刨析AdaBoost
- boost::tuple学习笔记
- C++“准”标准库Boost学习指南(8):Boost.Tuple
- boost::tuple学习笔记
- 【 nginx模块学习】nginx_http_push_module模块深入讲解和聊天室实现
- nginx模块学习——nginx_http_push_module模块深入讲解和聊天室实现
- nginx模块学习——nginx_http_push_module模块深入讲解和聊天室实现
- nginx模块学习——nginx_http_push_module模块深入讲解和聊天室实现
- Struts1学习之--14、动态FormBean的讲解
- WebRTC学习记录(1):采集microphone到文件原理实践&讲解【转】
- 深入学习Java之HashMap - 未完成