走进Boost
阿炯
摘要
一直流传这么一个说法,想成为高手,一定要多读高手写的源代码。哪些代码是好材料呢?C++标准库的源代码?不,如果您读过,就会发现:要么是各种实现独有的表达方式让人摸不着头脑,要么是恐怖的代码风格(如到处是下划线)憋得人难受。Boost库的代码则相当清晰,注释合理,命名规范,绝对是适合阅读的典范。同时,Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。
在本文中,我们将会介绍了Boost库的下载与安装,并将体验Boost库中一个非常简单实用的组件lexcial_cast
。
目录
- Boost简介
- 下载与安装
- lexical_cast
- 下载与安装
-
- 字符串→数值
- 数值→字符串
- 异常
- 注意事项
- 数值→字符串
- 字符串→数值
- 小结
Boost是什么?一套开放源代码、高度可移植的C++库。
谁发起的?C++标准委员会库工作组。所以,质量保证,不怕遇到假冒伪劣产品。
有些什么呢?瞧瞧:
- 正则表达式,可以与POSIX API和Perl语言处理正则表达式的功能相媲美,而且还能支持各种字符类型(如char、wchar_t,甚至还可以是自定义字符类型);
- 多线程,想了很久的跨平台多线程库了;
- 数据结构“图”,再加上即将加入标准的
hash_set
、hash_map
、hash_multiset
、hash_multimap
等等(事实上不少STL实作,如SGI STL,已经支持以上数据结构),C++对数据结构的支持已近完备; - python,没错,对Python语言的支持;
- 智能指针,与
std::auto_ptr
一起善加使用,可杜绝内存泄露,效率更不可和垃圾收集机制GC同日而语; - 更有循环冗余的CRC、可轻松定义返回多个值函数的元组
tuple
、可容纳不同类型值的any
、对标准库各方面的补充…… - 还在迅速扩大中,部分内容有望进入C++标准库……
去哪下载Boost呢?英文http://www.boost.org[1],中文http://boost.c-view.org,可以找到一个.zip或.tar.gz格式的压缩包。下载完毕后,解压到某个目录,比如boost_1_26_0,里面一般有这么几个子目录:boost、libs、more、people、status、tools,看看没问题就行了。
如果Boost更新时您懒得去下载整个压缩包,只希望更新发生变动的文件;或者您是一位跟我一样的Boost Fans,希望跟踪Boost的最新变化,不妨使用CVS方式。首先得有一个CVS客户端软件,比如CvsGui(http://www.wincvs.org或http://sourceforge.net/projects/cvsgui/)提供的WinCVS、gCVS和MacCVS,分别适用于Windows、Linux和MacOS平台。下载、安装、启动三步曲。
如果您习惯于传统CVS的命令行模式,那么可在Admin→Command Line...→Command line settings中输入下面一行[2]:
cvs -z3 -d:pserver:anonymous@cvs.boost.sourceforge.net:/cvsroot/boost checkout boost
勾上下面的复选框,选择本地目标目录(比如可以新建一个C:\Boost,这凭个人爱好),再点击确定即可开始更新。如果是第一次运行,则可能需要一段时间下载所有文件。当然以后更新就只需要很短的时间了。
如果您偏好GUI模式,请选择Admin→Preferences...,在General的Enter CVS ROOT中填写:
anonymous@cvs.boost.sourceforge.net:/cvsroot/boost
Authentication选择"passwd" file on the cvs server,同时Use version选择cvs 1.10 (standard)。然后在WinCvs的HOME folder中填写或选择一个本地目标目录,点击确定。选择View→Browse Location→Change...换到本地目标目录后,在Create→Check Module...→Checkout Settings的Enter the module name and path on the server中填写boost,单击确定即可。如果这一过程中要求输入密码,不必理会,直接回车就行。这是WinCVS 1.2的情况。如果您下载的是新的版本,请注意各项设置大同小异,如前面的Authentication选择pserver、不需要设置Use version等。
然后设置编译器。以Windows常用集成环境为例。Microsoft Visual C++ 6.0,可在工具→选择→目录处把Boost的路径(如前面的boost_1_26_0)添加到Include Files搜索路径中。而对于Borland C++ Builder 5.0,则是在Project→Options→Directories/Conditionals→Include Path中添加Boost的路径。还有一种比较常用的Dev-C++ 4.0(内置GNU C++,可从http://www.bloodshed.net处免费下载),可在Options→Compile Options→Directories→C++ include files处添加Boost的路径即可。其他IDE类似。至于命令行方式,则需在编译时对相应的头文件路径参数(Borland C++ Compiler、GNU C++是-I,VC++的cl是/I)给出Boost路径。
做到这一步,恭喜您,大部分Boost库就可以用了。
为什么不是全部?首先,目前还没有一个能完全符合C++标准的编译器,所以Boost库中的组件或多或少不可用,详细信息请看Boost网站上“编译器支持情况(Compiler Status)”一文。另外,有些库需要Build相应的lib或dll文件。不过这样的库很少,主要是由于平台相关性的原因,如处理正则表达式的regex库、支持python语言的python库等,而建构库的过程相当烦琐,需要使用Jam工具(可以简单提一下:在tools/build/jam_src/builds目录下有三个文件win32-borlandc.mk、win32-gcc.mk、win32-visualc.mk,分别是适用于Windows平台下的Borland C++ Compiler、GNU C++和Visual C++的mak文件。如果在Unix平台,则应使用tools/build/Makefile。用命令行工具make或nmake来做出Jam执行文件,然后再用Jam来建构库,详细内容可见Boost.Build文档)。我个人的建议是,不用急着去建构lib或dll。真的需要使用这些库时,再make随库提供的mak文件即可。虽然Boost.Jam也许是Boost库未来发展的方向,不过毕竟绝大部分库都无须建构,可以直接使用。
这次我们先挑个简单实用的Boost组件,看看Boost能给我们带来怎样的便利。
在CSDN论坛上经常看到询问如何在字符串类型和数值类型间进行转换的问题,也看到了许多不同的答案。下面先讨论一下从字符串类型到数值类型的转换。
如何将字符串"123"转换为int类型整数123?答案是,用标准C的库函数atoi
;
如果要转换为long类型呢?标准C的库函数atol
;
如何将"123.12"转换为double类型呢?标准C的库函数atod
;
如果要转换为long double类型呢?标准C的库函数atold
;
……
后来有朋友开始使用标准库中的string类
,问这个如何转换为数值?有朋友答曰,请先转换为const char*。我很佩服作答者有数学家的思维:把陌生的问题转化成熟悉的问题。(曾经有一则笑话,好事者问数学家:知道如何烧水吗?答:知道。把水壶加满水,点火烧。又问:如果水壶里已经有水了呢?答:先倒掉,就转化为我熟悉的问题了……)
不,不,这样是C的做法,不是C++。那么,C++该怎么做呢?使用Boost Conversion Library所提供的函数lexical_cast
(需要引入头文件boost/lexical_cast.hpp)无疑是最简单方便的。如:
#include <boost/lexical_cast.hpp>#include <iostream>int main(){ using boost::lexical_cast; int a = lexical_cast<int>("123"); double b = lexical_cast<double>("123.12"); std::cout<<a<<std::endl std::cout<<b<<std::endl; return 0;}一个函数就简洁地解决了所有的问题。
评论