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 <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()) //... } 即可得到正确结果 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库未来发展的方向,不过毕竟绝大部分库都无须建构,可以直接使用。 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; unsigned tokenise(std::list<std::string>& l, std::string& 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; } 运行成功! |
|