BCB系统使用BOOST

Boost库编译详解 VS命令提示符窗口中先编译bjam编译工具,然后对需要的boost库进行编译。 编译调试版本加 debug 编译发布版本加  release 编译静态链接库:link=static runtime-link=static 编译动态库:link=shared runtime-link=shared 示例: --t 阅读详情
正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的grep工具,还是perl语言都使用了正则表达式。传统的C++处理正则表达式是非常麻烦的,这也成为很多其他语言爱好者的笑柄,现在情况不一样了,因为有了boost。
Boost是一个基于Template的开发源代码库,在这个库中有很多子库用来高效处理各方面的问题,比如字符串拆分,格式化,线程等等,Boost对于每一个C++爱好者都是应该了解的,对于C++ Builder用户如果能在熟练使用VCL的情况下再熟练使用Boost,我想一定如虎添翼。
一般来说,使用Boost是非常简单,和使用其他STL库没有太大区别,但使用Boost的正则表达式库则不那么容易,因为这个库还需要我们单独编译,下面我将详细介绍如何使用。
如果你还不知道或者还没有Boost的话,你可以去www.boost.org下载最新版本,作者使用的是1.30版本。将下载下来的zip包 [1] 解压到任何你喜欢的目录,比如D:/boost。
编译正则表达式库
前面已经提到,这个库需要我们单独编译才能使用,为什么不编译好一起发布呢?主要是考虑到不同的编译器需要不同的链接库文件和链接库太大了。在命令行下,进入[%Boost]/Libs/RegEx/Build目录,直接敲入make –fbcb6.mak命令开始编译,这里请大家注意了,如果你的计算机上同时安装了BCB5,请一定要把path设置成为BCB6的bcc32.exe程序所在的目录,否则可能使用BCB5的make程序,这样虽然能编译但最后不能使用。
编译过程相当耗时,你需要耐心等待,最终编译完成,会在[%Boost]/Libs/RegEx/Build目录生成一个BCB6目录,在这个目录生成了很多lib文件和dll文件,把所有dll文件复制到windows系统目录,所以lib文件复制到bcb6/lib目录。如果你不想这么麻烦的复制文件,可以在编译时加入install参数,就像这样make –fBcb6.mak install,不过作者还是比较喜欢前一种方式,这样我可以知道到底生成了什么文件。现在编译已经完成了,你可以体现boost的神奇魅力了。
一个测试程序
在BCB6中创建console程序,编写下列代码:

#include<deque>
#include<iostream>
#include<algorithm>
#include<boost/regex.hpp>
 
int main()
{
  using namespace boost;
  using namespace std;
  regex expression("//s+href//s*=//s*/"([^/"]*)/"",regbase::normal|regbase::icase);
  string s="<a href=/"index.html/"><img src=/"logo.gif/"></a>";
  deque<string> result;
 regex_split( std::back_inserter(result),s,expression);
  copy(result.begin(),result.end(),ostream_iterator<string>(cout,"/n"));
   int c;
  cin>>c;
  return 0;
}

设置BCB6 Project属性的Lib Path和Include Path为你安装boost的目录,运行你会看到结果:
index.html
可以看到index.html已经从字符串中提出出来了,那么为什么会是这样呢?
代码的核心部分是:
regex expression("//s+href//s*=//s*/"([^/"]*)/"",regbase::normal|regbase::icase);
它用来设置如何匹配字符串,上面乱七八糟的字符串很难看懂,如果不了解正则表达式的书写规则,上面代码可以和天书媲美。
regbase::normal|regbase::icase 是解析参数设置,具体可以参考boost帮助文档。
正则表达式的书写规则
具体的书写规则,大家可以参看boost的文档,我这里做一下简要说明:
. (dot)
用来匹配任何一个字符,但不包括新行上的字符
*
闭包,任意有限次的自重复连接
+
有限次自重复连接,但至少出现一次
{}
指定可能的重复次数
例如:
ba* 匹配 b ba baa baaa等
ba+ 匹配 ba baa baaaaaaaaa等
ba{1,5} 匹配 ba baa baaa baaaa baaaaa
/
转义字符,有很多用途,根据参数设置而变化,最常见的就是类似于c语言/的用法
/s
匹配空格
/w
匹配一个单词
/d
匹配数字
()
有两种用法:
1是合并的作用,例如(ab)*匹配ab abab ababab等
2是确定匹配,也就是说在()中的字符将被最终拆解出来
根据上面这张表,我们可以很容易知道前面的那段天书如何解释。
一个实际的例子
前一段时间在CSDN上有一篇帖子,问题是有一种文件结构如(类似):
@People{
Age=19
Speek=”Hay,{name},how are you”
}
问如何拆分字符串得到@后面的名字,=两边的属性名和属性值,引号里{}种的名字。
解决这个问题用正则表达式再合适不过了。
根据分析,我们可以这样构造匹配规则:
"@(.*?)/s*//{" 匹配@开始的字符创,后面两种类型如何构造匹配规则留给大家思考吧。
这样我们可以轻易拆解这个例子。
性能分析
通过上面的讨论,大家已经了解到boost的强大威力,那个性能又如何呢?为此我们再实际来拆分一个复杂的html代码,看看到底需要花费多少时间。
为了节省篇幅,这里就不列出html代码了,不过可以告诉大家,这是一个又Word生成的大小为186K的html文件,这个文件中用到了很多<table>标签,所以我这里测试就来拆分所有<table>标签的width属性。测试代码如下:

#include<deque>
#include<iostream>
#include<algorithm>
#include<boost/regex.hpp>
#include<vcl.h>
 
int main()
{
  using namespace boost;
  using namespace std;
 TStringList* html=new TStringList();
 html->LoadFromFile("D://1.htm");
 regex expression("//s+width=([^/"]*)/s+",regbase::normal|regbase::icase);
 DWORD start=GetTickCount();
  for(int n=0;n<html->Count;n++)
 {
    string s=html->Strings[n].c_str();
    deque<string> result;
    regex_split(std::back_inserter(result),s,expression);
copy(result.begin(),result.end(),ostream_iterator<string>(cout,"/n"));
result.clear();
 }
 start=GetTickCount()-start;
  delete html;
 cout<<start;
  int c;
 cin>>c;
  return 0;
}

输出结果为671毫秒,拆分得到1072个width属性值,我们可以看到boost的效率是非常高的,虽然与一些角本语言比起来解析速度还是慢,但已经可以满足大多数编程要求了。另外作者的计算机配置并不是非常高,相信拿到现在任何一台主流配置的计算机上都会优于作者的结果。
结束语
其实上面的强大威力只是boost的冰山一角,如果你不自己去体会,你很难想象到boost的强大威力。在boost里还有很多使用的库,比如格式化输出,字符串拆解,类型转换等,这些库使用起来也比较方便,大家可以自行参考boost文档。在这些库中还有两个库需要自行编译,他们是Python和thread库,而且这些库的编译需要专门的工具Jam,所以我们在编译这些库的时候还要编译jam工具,而编译jam工具也不是一件快乐的事情,麻烦同样出现在如果你安装了多个编译器,如果读者有兴趣可以自己试一下。
不过BCB6并不支持全部boost库,从boost提供的编译器支持表可以看到 [2] ,BCB6还是有相当多的库不支持的,支持最好的是gcc/g++的编译器,但也不是全部支持。希望borland下一个将要发布的C++编译器可以支持更多C++标准。


[1] 其实还有其他类型的包,但在windows系统下,你最好下载zip包
[2] Boost提供的编译器支持表是针对BCB5的,对于BCB6的支持作者并没有详细测试,如果读者有兴趣可以自己测试boost附带的测试代码。
 
使用BCB编译Boost.Thread库编程 Boost.Thread是一个流行的C++线程库,它提供了一组丰富的线程管理功能,使得多线程编程变得更加容易。您可以从Boost官方网站(https://www.boost.org)下载最新版本的Boost库,并按照官方文档中的说明进行安装。通过以上步骤,您已经成功地使用BCB编译Boost.Thread库,并创建了一个简单的多线程应用程序。找到您安装Boost库的路径,并将其添加到“包含文件”和“库文件”目录中。运行程序后,单击界面上的按钮,将启动一个新的线程,并显示一个消息框,表明线程正在运行。 阅读详情

相关推荐

使用BCB制作控制面版程序 (转)

使用BCB制作控制面版程序 (转)[@more@]用BCB开发控制面板程序   前不久,Inprise公司(原Borland公司)正式公布了Delphi 5.0版,其开发向导中支持了“控制面板程序(CPL)”框架的生成,利用它...

csd3176的博客 204

编译boost date_time

boost当前最新版本:1.47.0 分别在vs2005和bcb 6下编译. .vs2005下可用 .bcb 6编译出错 1.下载: 下载位置:www.boost.org 文件名:boost_1_47_0.zip 解压下载的文件:以下用$BOOST_HOME表示解压的主目录   2.生成bjam.exe文件,该文件是用来编译boost程序 .cd $BOOST

wherwh的专栏 1888

BCB6.0编译boost 1.39.0的thread库

BCB6.0编译boost 1.39.0的thread库 问题 在BCB6.0下编译 使用如下指令编译boost 1.39.0的thread库,使用如下指令 bjam --toolset=borland-6.0 --with-thread stage debug threading=multi link=shared 进行编译,将出现如下错误: [C++ Error] thre

铭星的专栏 2059

Boost库的介绍

<br />一、Boost库的介绍       Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。      Boost库中比较有名的几个库:   (1)Regex正则表达式库;   (2)Spirit,LL parser fra

SunStone的小屋 998

BCB使用DUnit

因为最近在用BCB写一个程序,而C++测试框架没有什么好用的:CppUnit(GUI)只支持VC(现在好像也支持XWIN,不过没试过),boost测试框架只有命令行。而我在DELPHI下用DUnit习惯了,所以就想到在BCB使用DUnit,经过一番尝试,终于取得了成功。虽然说BCB和DELPHI都是基于VCL,但C++毕竟还是与DELPHI不同的,本文将按DUnit文档中所说的那个最简单的例

猛禽的编程艺术 5623

C++ Builder6使用Boost正则表达式

C++ Builder6使用Boost正则表达式库撰文:Aweay正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的grep工具,还是perl语言都使用正则表达式。传统的C++处理正则表达式是非常麻烦的,这也成为很多其他语言爱好者的笑柄,现在情况不一样了,因为有了boostBoost是一个基于Template的开发源代码库,在这个库中有很多子库用来高效

Siney的BlOG http://www.sineysoft.com 8116

BCB2007(SP3)上安装最新的Boost 1.34.1

作者:waiting4you 1. 准备工作:从http://sourceforge.net/project/showfiles.php?group_id=7586下载boost 1.34.1,写这篇文章时它的最新版本boost-build 2.0-m12,写这篇文章时它的最新版本(其实这个boost里已经带了,不过我总是喜欢用最新版的:-P)从http://bcbbo

C++Builder加油站 3011

vc和bcb中的stl/boost版本

最初的想法是将vc和其他编译器写出来的东西可以二进制级别的复用,做成COM调用起来麻烦,而基本类型pod也不方便,就想统一一下不同编译器中的stl版本。 拿vc9和bcb6来说,因为stl版本不同,容器的大小和实现都不一样,如果dll的头文件中有stl的东西,生成的dll便不能通用。 因为bcb6中的stl是stlport,版本好像是4.5.于是找来了stlport从4.0到最新版的5.21,

sylar的个人主页 1611

Boost库的编译

<br />Boost库本身不用多介绍,每个用C++的人都对它有或多或少的概念。尽管它存在着是否过度设计、是否学院派这类的争论,不过作为C++标准库的 后备它的优秀是谁也否认不了的。下面是网上摘录的一段:这世上总会有一些智慧让你吃惊。Boost就是这样的东西。Boost没有修改C++的任何规则。它是一个完全符合C++规范的代码库。<br />对于大部分Boost应用来说,它是不用编译的,直接包含头文件就可使用,如:any<br /> array<br /> asio<br /> conversion

dainiao01的专栏 2708

编译Boost

环境介绍 Window XP + Visual Studio 2008 获取Boost库源码 我们可以从http://www.boost.org/ 上获取boost的源代码。当前最新版本为1.45.0。 解压到指定目录 例如:D:/Program Files/boost/目录下 获取bjam 一种方式:从http://sourceforge.net/projects/boost/fi

好记性不如烂笔头 6523

boost编译

Boost库的编译 Boost库本身不用多介绍,每个用C++的人都对它有或多或少的概念。尽管它存在着是否过度设计、是否学院派这类的争论,不过作为C++标准库的后备它的优秀是谁也否认不了的。下面是网上摘录的一段: ·        这世上总会有一些智慧让你吃惊。Boost就是这样的东西。 ·        Boost没有修改C++的任何规则。它是一个完全符合C++规范的代码库。 对于大部

628

Boost Build

Window XP + Visual Studio 2008 获取Boost库源码 我们可以从http://www.boost.org/ 上获取boost的源代码。当前最新版本为1.45.0。 解压到指定目录 例如:D:/Program Files/boost/目录下 获取bjam 一种方式:从http://sourceforge.net/projects/boost/files/bo

Programmer小卫 2934

boost库生成文件命名和编译

boost库生成文件命名和编译 生成文件命名规则:boost中有许多库,有的库需要编译、而有的库不需要编译,只需包含头文件就可以使用。编译生成的文件名字普遍较长,同一个库根据编译链接选项不同,又可以生成多个不同名字的文件。生成的文件名字是很长,可是这样带的信息才多,也就容易识别出用途。其实生成文件的名字遵循一定的规则,有着固定的格式。识别这种格式,能帮助我们更高效地使用boost库。生成文件名字

可可西里 1067

mark一下boost

http://blog.sina.com.cn/s/blog_40b056950100ht8p.html 出处:http://hi.baidu.com/vc_net/item/3dc5d0d9f07741e955347f45 windows下boost怎样安装与使用说明? 第1步: 先从官网(www.boost.org)下载最新版的BOOST源码,如图所示 随便下哪个都行,我这里

kingjo002的专栏 650

Boost-Boost库的编译

Boost库本身不用多介绍,每个用C++的人都对它有或多或少的概念。尽管它存在着是否过度设计、是否学院派这类的争论,不过作为C++标准库的 后备它的优秀是谁也否认不了的。下面是网上摘录的一段: 这世上总会有一些智慧让你吃惊。Boost就是这样的东西。Boost没有修改C++的任何规则。它是一个完全符合C++规范的代码库。 对于大部分Boost应用来说,它是不用编译的,直接包含头文件就可

ljmwork的专栏 548
上一篇: 如何编译BOOST
下一篇: EditLog类的使用
vrix
博客等级 码龄23年 670粉丝 167原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值