1下载
官方网站:
www.boost.org 按照连接到sourceforge指定地方下载boost_1_34_0.zip
2安装
我目前只是在window机器上使用了一下。
解压后,
需要设置两个地方。
第一, 执行boost_1_34_0/tools/jam/src 下的build.bat,会生成/bin.ntx86/bjam.exe,将bjam.exe拷贝到你的boost库的根目录下,在命令行下执行之。过程有点长,plz wait! 另外,因为它默认对多种编译器都同时进行了配置,所以如果你没有装一些编译器的话,会看到屏幕上会打印出很多系统找不到指定目录的信息,没关系。
第二, 第二,设置编译器查找库文件路径的地方,比如VC6中, tools->option->directory, 加入你的boost库根路径就可以了
3 试用
from: dozb的程序人生,稍加修改
字符串→数值
#include <boost/lexical_cast.hpp>
#include <boost/lexical_cast.hpp>
#include <iostream>
using namespace boost;
using namespace std;
int main()
{
int a = lexical_cast<int>("123");
double b = lexical_cast<double>("123.12");
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
数值→字符串
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
using std::string;
const double d = 123.12;
string s = boost::lexical_cast<string>(d);
std::cout<<s<<std::endl;
return 0;
}
异常
如果转换失败,则会有异常bad_lexical_cast抛出。该异常类是标准异常类bad_cast的子类。
#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
using std::cout;
using std::endl;
int i;
try{
i = boost::lexical_cast<int>("abcd");
}
catch(boost::bad_lexical_cast& e)
{
cout<<e.what()<<endl;
return 1;
}
cout<<i<<endl;
return 0;
}
显然“abcd”并不能转换为一个int类型的数值,于是抛出异常,捕捉后输出“bad lexical cast: source type value could not be interpreted as target”这样的信息。
注意事项
lexical_cast依赖于字符流std::stringstream(会自动引入头文件<sstream>[4]),其原理相当简单:把源类型读入到字符流中,再写到目标类型中,就大功告成。例如
int d = boost::lexical_cast<int>("123");
就相当于
int d;
std::stringstream s;
s<<"123";
s>>d;
既然是使用了字符流,当然就有些随之而来的问题,需要特别指出[5]。
由于Visual C++ 6的本地化(locale)部分实现有问题,因此如果使用了非默认的locale,可能会莫名其妙地抛出异常。当然,一般情况下我们并不需要去改变默认的locale,所以问题不是很大。
输入数据必须“完整”地转换,否则抛出bad_lexical_cast异常。例如
int i = boost::lexical_cast<int>("123.123"); // this will throw
便会抛出异常。因为“123.123”只能“部分”地转换为123,不能“完整”地转换为123.123。
浮点数的精度问题。
std::string s = boost::lexical_cast<std::string>(123.1234567);
以上语句预想的结果是得到“123.1234567”,但是实际上我们只会得到“123.123”,因为默认情况下std::stringstream的精度是6(这是C语言程序库中的“前辈”printf留下的传统)。这可以说是boost::lexical_cast的一个bug。怎么办呢?权宜之计,可以这么做:打开头文件<boost/lexical_cast.hpp>,注意对照修改[6]:
#include <boost/limits.hpp>
//...
template<typename Target, typename Source>
Target lexical_cast(Source arg) {
//...
Target result;
interpreter.precision(std::numeric_limits<Source>::digits10);
if( !(interpreter << arg) ||
!(interpreter >> result) ||
!(interpreter >> std::ws).eof())
//...
}
即可得到正确结果
数值→字符串
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
using std::string;
const double d = 123.12;
string s = boost::lexical_cast<string>(d);
std::cout<<s<<std::endl;
return 0;
}
异常
如果转换失败,则会有异常bad_lexical_cast抛出。该异常类是标准异常类bad_cast的子类。
#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
using std::cout;
using std::endl;
int i;
try{
i = boost::lexical_cast<int>("abcd");
}
catch(boost::bad_lexical_cast& e)
{
cout<<e.what()<<endl;
return 1;
}
cout<<i<<endl;
return 0;
}
显然“abcd”并不能转换为一个int类型的数值,于是抛出异常,捕捉后输出“bad lexical cast: source type value could not be interpreted as target”这样的信息。
注意事项
lexical_cast依赖于字符流std::stringstream(会自动引入头文件<sstream>[4]),其原理相当简单:把源类型读入到字符流中,再写到目标类型中,就大功告成。例如
int d = boost::lexical_cast<int>("123");
就相当于
int d;
std::stringstream s;
s<<"123";
s>>d;
既然是使用了字符流,当然就有些随之而来的问题,需要特别指出[5]。
由于Visual C++ 6的本地化(locale)部分实现有问题,因此如果使用了非默认的locale,可能会莫名其妙地抛出异常。当然,一般情况下我们并不需要去改变默认的locale,所以问题不是很大。
输入数据必须“完整”地转换,否则抛出bad_lexical_cast异常。例如
int i = boost::lexical_cast<int>("123.123"); // this will throw
便会抛出异常。因为“123.123”只能“部分”地转换为123,不能“完整”地转换为123.123。
浮点数的精度问题。
std::string s = boost::lexical_cast<std::string>(123.1234567);
以上语句预想的结果是得到“123.1234567”,但是实际上我们只会得到“123.123”,因为默认情况下std::stringstream的精度是6(这是C语言程序库中的“前辈”printf留下的传统)。这可以说是boost::lexical_cast的一个bug。怎么办呢?权宜之计,可以这么做:打开头文件<boost/lexical_cast.hpp>,注意对照修改[6]:
#include <boost/limits.hpp>
//...
template<typename Target, typename Source>
Target lexical_cast(Source arg) {
//...
Target result;
interpreter.precision(std::numeric_limits<Source>::digits10);
if( !(interpreter << arg) ||
!(interpreter >> result) ||
!(interpreter >> std::ws).eof())
//...
}
即可得到正确结果
4 说明
做到以上几步,恭喜您,大部分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库未来发展的方向,不过毕竟绝大部分库都无须建构,可以直接使用。
为什么不是全部?首先,目前还没有一个能完全符合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库未来发展的方向,不过毕竟绝大部分库都无须建构,可以直接使用。
5. regex库的安装,试用
先做一点试试,我的平台还是windows XP+ VC6.0
step1: 找到文件vcvars32.bat ,备用
step2: 打开一个cmd窗口,并把路径切换到我的boost库目录下的 /libs/regex/build 子目录,找到vc6.mak文件
step3: 运行 'nmake -fvc6.mak ' ,错误提示: Error MSVCDIR 变量没有指定! 解决办法:在vcvars32.bat中找到
类似"set MSVCDir=C:/PROGRA~1/MICROS~2/VC98" 的一行,拷贝等号后面的路径。用UE打开vc6.mak文件
在前面点的位置 定义怎么一行"MSVCDIR = C:/PROGRA~1/MICROS~2/VC98"。 把这个新的mak文件另存为vc6_new.mak
step 4: 运行 'nmake -fvc6_new.mak ' , 然后便会产生所需的库文件等
step5: 运行 'nmake -fvc6_new.mak install' ,就会自动将regex库文件拷贝到 MSVCDIR 指定的目录下的相关目录下(如/bin,/libs等)
这样就 基本搞定了。关于什么regex++,我还没有试过。
在
VS2005
下编译
boost
库
1.
启动
VS2005
,在
Tool
菜单中选择
“Visual Studio 2005 Command Prompt“
。
VS
会启动命令提示符窗口,并自动设置好相应的环境变量。
2.
转到
<boost>/libs/regex/build
目录下(
<boost>
是你存放
boost
代码的路径),运行以下命令即可进行编译,这个过程可能会比较久:
nmake -f vc8.make
3.
运行以下命令进行安装,
boost
会把上一步产生的
lib
文件等拷贝到你的
VC
目录下。
nmake -f vc8.make install
4.
最后清除安装时产生的临时文件:
nmake -f vc8.make clean
OK,大功告成!可以享用正则表达式带来的强大威力了!
试用
现在找到regex程序小试一下:
实现一个简单的split功能
#include <list>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
unsigned tokenise(std::list<std::string>& l, std::string& s)
{
return boost::regex_split(std::back_inserter(l), s);
}
{
return boost::regex_split(std::back_inserter(l), s);
}
int main()
{
string s = "i am a boy!";
list<string> l;
unsigned result = tokenise(l, s);
cout << result << " tokens found" << endl;
while(l.size())
{
s = *(l.begin());
l.pop_front();
cout << s << endl;
}
return 0;
}
运行成功!
{
string s = "i am a boy!";
list<string> l;
unsigned result = tokenise(l, s);
cout << result << " tokens found" << endl;
while(l.size())
{
s = *(l.begin());
l.pop_front();
cout << s << endl;
}
return 0;
}
运行成功!