《Boost程序库完全开发指南》第四章-实用工具

1、如果需要继承一个不可复制的父类,直接使用boost的noncopyable类,需要包含以下头文件;

#include <boost/utility.hpp> // 或者 #include <boost/noncopyable.hpp>

2、在C++11中,变量的类型可以采用decltype或者auto来声明,但是在boost中,可以采用typeof来声明,定义了二个宏:BOOST_TYPEOF 和 BOOST_AUTO,分别用于仿真C++11的decltype或者auto,使用typeof需要包含头文件#include<boost/typeof/typeof.hpp>。

#include <boost/typeof/typeof.hpp>
#include <iostream>

using namespace std;

void typeof_usage()
{
	BOOST_TYPEOF(2+3) a = 2+3;
	BOOST_AUTO(b, 1*3);
	b = 5;
	cout<< "a = " <<a <<",b = "<<b<<endl;
	BOOST_AUTO(p, new int(10));
	cout<<"*p = " <<*p <<endl;
	delete p;
}

3、typeof库支持c++内置的基本类型和stl中的大多数类型,但是如果希望typeof库支持自己定义的类,需要注册一组宏

#include <boost/typeof/typeof.hpp>
#include <iostream>

using namespace std;

//typeof库支持c++内置的基本类型和stl中的大多数类型,但是如果希望typeof库支持自己定义的类,需要注册一组宏
#define  BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace ex{
	struct demo_class{int a, b;};
}
BOOST_TYPEOF_REGISTER_TYPE(ex::demo_class) //向typeof库注册类

void test_self_difine_class()
{
	BOOST_AUTO(x, make_pair("test", ex::demo_class()));
	cout<<typeid(x).name()<<endl;
	x.second.a = 1;
	x.second.b = 2;
	cout<<"x.second.a = " << x.second.a << ", x.second.b = " <<x.second.b<<endl;
}

输出:

struct std::pair<char const *,struct ex::demo_class>
x.second.a = 1, x.second.b = 2
请按任意键继续. . .

4、optinal 应用

#include <boost/optional.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using namespace boost;

void optional_simple_usage()
{
	optional<int> op1;
	optional<int> op2(boost::none);
	assert(!op1);
	assert(op1==op2);
	cout<<boolalpha<< (op1.get_value_or(253) == 253)<<noboolalpha<<endl;
	optional<string> ops("hello");
	cout<<*ops<<endl;
	
	//vector
	vector<int> vi(10);
	optional<vector<int>& > ovi(vi);
	ovi->push_back(5);
	cout<<ovi->size()<<endl;
	ovi = none;
	assert(!ovi);//wrong usage: cout<<ovi->size()<<endl;
}
调用optional(bool Condition, T v)

optional<double> calc(int x)
{
	return optional<double> (x != 0 , 1.0/x);
}
void optional_complex_usage()
{
	optional<double> d = calc(10);
	cout<<"d = " <<*d<<endl;
}

5、assign的应用

#include <boost/assign.hpp>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <queue>
#include <deque>

using namespace std;

void assign_usage()
{
	using namespace boost::assign;
	//vector push_back
	vector<int> vi;
	vi+=1,2,3,4,5;
	push_back(vi)(6)(7)(8)(9)(10);
	push_back(vi),11,12,13,14,15;
	//list
	list<string> ls;
	push_front(ls) ("aaa") ("bbb") ("ccc");

	//set-insert
	set<string> ss;
	ss+="aaa", "bbb", "ccc";
	insert(ss) ("ddd") ("eee");
	
	//map insert
	map<int, string> mis;
	mis+=make_pair(1,"aaa"), make_pair(2,"bbb");


	//初始化容器使用函数list_of
	vector<int> vilistof =  list_of(1)(2)(3)(4)(5);
	//重复输入
	vector<int> vilistof_repeat = list_of(1).repeat(5,1);// 1,1,1,1,1

	deque<string> ds = list_of("aaa")("bbb")("ccc");
	set<int> si = (list_of(1),(2),(3));


	//对于map需要单独使用pair_list_of或map_list_of
	map<int, string> mislist = map_list_of(1,"aaa")(2, "bbb") (3,"ccc");

	//转换为stack和queue
	stack<int> stk = (list_of(1), 2, 3).to_adapter();
	queue<string> qs = (list_of("aaa") ("xxxx") ("zzz")).to_adapter();
	priority_queue<double> pqd = (list_of(1.11), 1.12, 1.3, 1.5).to_adapter();

	//引用初始化列表
	int a = 1, b =2 ,c = 3;
	vector<int> v = ref_list_of<3>(a) (b) (c);
}

6、尽量使用boost::swap,它的效率比std::swap要高,提供了比std::swap更好的优化策略;使用方法有二种

公共测试类

class widget_swap{
public:
	explicit widget_swap(int a = 0, int b = 0, int c = 0 ) : a_(a), b_(b), c_(c)
	{
		int x = 10;
	}
	void print(){
		cout<<"a = " <<a_<<"b = "<<b_<<"c = "<<c_<<endl;
	}
	void swap(widget_swap& st)
	{
		std::swap(a_, st.a_);
		std::swap(b_, st.b_);
		std::swap(c_, st.c_);
		cout<< "class inner swap"<<endl;
	}

private:
	int a_, b_, c_;
};

(1)特化std::swap模板

#include <boost/swap.hpp>
#include <iostream>

using namespace std;

namespace std{
<span style="white-space:pre">	</span>//特化std::swap函数
	template<>
	void swap(widget_swap& lhs, widget_swap& rhs){
		lhs.swap(rhs);
	}
}

void test_swap()
{
	widget_swap a(1,2,3), b(4,5,6);
	cout<<"std::swap"<<endl;
	std::swap(a, b);
	cout<<"boost::swap"<<endl;
	boost::swap(a, b);//与上述std::swap等效
}

(2)定义一个全局函数swap

void swap(widget_swap& lhs, widget_swap& rhs){
	lhs.swap(rhs);
}
void test_swap()
{
	widget_swap a(1,2,3), b(4,5,6);
	cout<<"std::swap"<<endl;
	std::swap(a, b);//调用std::swap
	cout<<"boost::swap"<<endl;
	boost::swap(a, b);//调用boost::swap, boost::swap调用全局函数swap
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值