1. 介绍
boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化。
不过对比STL,boost更加实用。STL集中在算法部分,而boost包含了不少工具类,可以完成比较具体的工作。
boost主要包含一下几个大类:字符串及文本处理、容器、迭代子(Iterator)、算法、函数对象和高阶编程、泛型编程、
模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、内存相关、语法分析、杂项。
有一些库是跨类别包含的,就是既属于这个类别又属于那个类别。
2、安装
1)编译boost库
第一步:下载boost库,下载地址http://sourceforge.net/projects/boost/files/boost/1.55.0/
注意版本要与vs版本兼容,我的vs版本是2010。
第二部:解压boost库,例如解压到F: \boost_1_55_0
第三部:开始->程序->MicrosoftVisual Studio 2010->Visual Studio Tools->VisualStudio 命令提示(2010),打开一个控制台
第四部:cd F:\boost_1_55_0
注意要切换至该目录,建议用dir鉴别一下当前目录,必要时要单独用f:切换一下。
第五部:bootstrap.bat
第六步:bjam.exe--toolset=msvc-10.0 --build-type=complete
msvc-10.0代表vs2010
2)配置
创建一个工程,附加包含目录为:F:\boost_1_55_0;附加库目录为:F: \boost_1_55_0\stage\lib
3、使用
1)正则表达式的应用
#include<iostream>
#include <boost/regex.hpp>
using namespace std;
int main()
{
// 3 digits, a word, any character, 2 digits or "N/A",
// a space, then the first word again
boost::regex reg("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");
std::string correct="123Hello N/A Hello";
std::string incorrect="123Hello 12 hello";
assert(boost::regex_match(correct,reg)==true);
assert(boost::regex_match(incorrect,reg)==false);
cout<<"Hello Boost !"<<endl;
}
C++多线程开发是一个复杂的事情,mfc下提供了CWinThread类,和AfxBeginThread等等函数,但是在使用中会遇到很多麻烦事情,例如线程之间参数传递的问题,我们一般都是把参数new一个结构体,传递给子线程,然后释放的工作交给了子线程,这样不可避免会有内存泄漏的危险,例如线程关闭的问题, 我们一般用WaitForSingleObject来完成线程关闭工作,但是这个函数并不一定保证线程能收到要关闭的信号,这样父亲已经退出工作了,子线程还在工作,程序也会有潜在的危险。boost标准stl库的出现,使用boost::thread来取代不太安全的MFC线程编程。
#include <iostream>
#include <boost/regex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
using namespace std;
boost::mutex io_mutex;
struct cont
{
cont(int id) : id(id) { }
void operator()()
{
for (int i = 0; i < 10; ++i)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << id << ": " << i << std::endl;
}
}
int id;
};
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread thrd1(cont(1));
boost::thread thrd2(cont(2));
thrd1.join();
thrd2.join();
return 0;
}
3)智能指针
内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针。垃圾回收机制因为性能等原因不被C++的大佬们推崇,而智能指针被认为是解决C++内存问题的最优方案。
scoped_ptr 是boost中最简单的智能指针。scoped_ptr的目的也是很简单, 当一个指针离开其作用域时候,释放相关资源。特别注意的一定就是scoped_ptr 不能共享指针的所有权也不能转移所有权。也就是说这个内存地址就只能给的声明的变量用,不能给其他使用。
下面是scoped_ptr的几个特点:
scoped_ptr的效率和空间的消耗内置的指针差不多。
scoped_ptr不能用在标准库的容器上。(用shared_ptr代替)
scoped_ptr 不能指向一块能够动态增长的内存区域(用scoped_array代替)
class test
{
<span style="white-space:pre"> </span>public:
void print()
{
<span style="white-space:pre"> </span>cout << "test print now" <<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
<span style="white-space:pre"> </span>boost::scoped_ptr<test> x(new test);
<span style="white-space:pre"> </span>x->print();
<span style="white-space:pre"> </span>return 0;
}
4、总结
以上主要介绍boost库中比较常用的正则表达式、多线程和智能指针,boost库的内容非常多,但是用好的话会给我们的C++编程代理极大的方便。