boost教程(十五):数据结构-元组

每一部分都单独注释的,运行时取消注释,将其他部分注释起来就可以。

#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_io.hpp> 
#include <boost/tuple/tuple_comparison.hpp>
#include <string> 
#include <iostream> 


boost::tuple<std::string, int> func()
{
	return boost::make_tuple("Error message", 2009);
}

int test()
{
	
	
	/*
	 boost::tuple 就扩展了 C++ 的数据类型 std::pair 用以储存多个而不只是两个值。
	*/
	//typedef boost::tuple<std::string, std::string> person;
	//person p("Boris", "Schaeling");
	输出会带括号,我了个大草
	若想要让元组和流一起使用, 你还需要包含头文件: boost/tuple/tuple_io.hpp 才行。
	//std::cout << p << std::endl;



	//存储三个
	//typedef boost::tuple<std::string, std::string, int> person;
	//person p("Boris", "Schaeling", 43);
	//std::cout << p << std::endl;

	///*
	//头输出不带括号,尾的输出带括号。第一个的尾是除了第一个元素剩余的部分。
	//*/
	//std::cout << p.get_head() << std::endl;
	//std::cout << p.get_tail() << std::endl;
	//std::cout << p.get_tail().get_head() << std::endl;
	//std::cout << p.get_tail().get_tail() << std::endl;







	/*
	std::pair 有辅助函数 std::make_pair() 一样, 一个元组也可以用它的辅助函数 boost::make_tuple() 来创建。
	*/

	//std::cout << boost::make_tuple("Boris", "Schaeling", 43) << std::endl;




	/*
	一个元组也可以存储引用类型的值。
	person 的第一个元素是一个指向 s 的引用。 Boost.Ref 中的 boost::ref() 就是用来创建这样的引用的。 
	相对的, 要创建一个常量的引用的时候, 你需要使用 boost::cref() 。
	*/
	/*std::string s = "Boris";
	std::cout << boost::make_tuple(boost::ref(s), "Schaeling", 43) << std::endl;*/




	/*
	元素的访问
	两种方式:如下
	索引值合法性的检查会在编译期执行, 故访问非法的索引值会引起编译期错误而不是运行时的错误。
	*/
	/*typedef boost::tuple<std::string, std::string, int> person;
	person p = boost::make_tuple("Boris", "Schaeling", 43);
	std::cout << p.get<0>() << std::endl;
	std::cout << boost::get<0>(p) << std::endl;*/
	
	
	

	/*
	修改元素
	*/
	/*typedef boost::tuple<std::string, std::string, int> person;
	person p = boost::make_tuple("Boris", "Schaeling", 43);
	p.get<1>() = "Becker";
	std::cout << p << std::endl;*/




	/*
	提供了比较运算符。 为了使用它们, 你必须要包含相应的头文件: boost/tuple/tuple_comparison.hpp 。
	还定义了一些其他的比较操作, 比如用来做字典序比较的大于操作等。
	*/
	//typedef boost::tuple<std::string, std::string, int> person;
	//person p1 = boost::make_tuple("Boris", "Schaeling", 43);
	//person p2 = boost::make_tuple("Boris", "Becker", 43);
	输出结果是1,表示p1  p2是不同的
	//std::cout << (p1 != p2) << std::endl;





	/*
	 特殊元组Tier 。 Tier 的特殊之处在于它包含的所有元素都是引用类型的。
	*/
	//typedef boost::tuple<std::string&, std::string&, int&> person;

	//std::string firstname = "Boris";
	//std::string surname = "Schaeling";
	//int shoesize = 43;
	//person p = boost::tie(firstname, surname, shoesize);
	在修改变量 surname 的同时, tier 也会跟着改变。
	//surname = "Becker";
	//std::cout << p << std::endl;



	/*
	当然可以用 boost::make_tuple() 和 boost::ref() 来代替构造函数 boost::tie() 。
	*/
	/*typedef boost::tuple<std::string&, std::string&, int&> person;

	std::string firstname = "Boris";
	std::string surname = "Schaeling";
	int shoesize = 43;
	person p = boost::make_tuple(boost::ref(firstname), boost::ref(surname), boost::ref(shoesize));
	surname = "Becker";
	std::cout << p << std::endl;*/



	/*
	也可以用作“拆箱”元组。元组中的各个元素就被很方便的“拆箱”并直接赋给了其他变量。
	*/

	std::string errmsg;
	int errcode;
	/*
	通过使用 boost::tie() , 元组中的元素:字符串“Error massage”和错误代码“2009”
	就很方便地经 func() 的返回值直接赋给了 errmsg 和 errcode 。
	*/
	boost::tie(errmsg, errcode) = func();
	std::cout << errmsg << ": " << errcode << std::endl;

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值