这些文章,是从网络上摘录整理的,如有侵犯你的版权,请来信通知我删除。
1. 初探Boost |
Boost是一个C++库。由于其制作精良,很有可能会成为继STL后的又一个C++标准库。当然对于一般C++程序员来说,Boost库过于庞大。当第一次登陆www.boost.org网站时,你会不禁迷失于那沟壑纵横的链接页面。而且Boost是一个开放的库,来源于C++不同领域内的专家,代码自风格各异,文档也繁简不同。所以对于一个新手来说,boost是一个盛宴,不仅要有美食的经验可以游走于不同菜系,还要有健壮的胃口进行超负荷工作,才能品出其中万千滋味来。
对于在Windows下成长的一代程序员,Boost库则更显得"面目奇异"--没有统一风格的文档/没有Ctrl+F1的帮助,甚至于没有一个Windows标准的"下一步"安装程序。难怪当他们在Visual Studio/C++Builder中打开Boost库时,会惊叹于其宏伟,哀叹于其不可用。Boost的调试使用对于Windows程序员似乎有点"梦魇"的滋味呢!但要知道这些Boost的构建者可很多比Windows的岁数大,而且很多从未在Windows平台下工作过,对于他们来说Windows是一个商业产品,而不是计算机软件的全部。
1.1. Boost中的字符串处理库
"C++语言是一个创举",这句话从上世纪八十年代一直流传至今。但今天的新一代程序员,在看过Java/C#等语言后再回眸C++,似乎总有点瞧不起。"那个没有string类型的老旧语言"/"那个没有垃圾回收(GC)的东西"……,当他们在C++中面对在Java/C#中可以轻松解决的字符处理问题时,抓狂与抱怨铺天盖地而来。噢,先甭抓了,否则三十岁未到一定谢顶。在C++中也可以轻松面对字符处理。这不是天方夜谭,虽然C++语言没有过多地涉及字符处理的技术细节,但在STL和Boost中都有很好的函数库可以使用,其方便快捷一点也不逊色于Java/C#。下面可看看Boost中如何进行的字符串处理。
1.1.1. Boost.Regex
Boost.Regex是Boost中一个解决正则表达式的库。正则表达式(Regular Expression)是一组特定的字符标示串,其可用于对字符串进行筛选过滤搜索定位等复杂操作。正则表达式最早广泛应用于Perl语言中--其作为文本处理的利器在WWW网的婴儿期做出巨大的贡献。后来在许多语言中,正则表达式作为标准库成为语言的一部分,比如微软公司的C#语言中就包含了一个强大的Regular库(它是.Net框架库的一部分)。Boost.Regex赋予C++程序员控制正则表达式的能力,这样其可从容面对各种复杂的文本处理问题了。Boost.Regex将是我们要详细学习的一个库。
1.1.2. Boost.Spirit
如果说Boost.Regex是普通C++程序员文本处理的匕首,那么Boost.Spirit则是计算科学专家的宝剑。它主要解决如何实现语言分析功能,即命令行级的文本分析器。在Spirit的帮助下编写一个程序预编译器应该不是件"难"事。但面对它,我们只浏览一遍,因为对于Boost的初学者来说,Spirit所涉及的计算科学知识实在是太深了。
1.1.3. Boost.String_algo
Boost.String_algo是一组string相关处理的函数库,包括转换/缩减/切割等操作,这是最常用的字符串处理库。
1.1.4. Boost.Tokenizer
Boost.Tokenizer是将一串字符切割成多个记号(Token),在串行传输与控制中将起重要的作用。
1.2. Boost中的数据结构
《数据结构》是每个计算机学科的基础课程,目前该课程在国内的教学语言一般为C++。但很可惜的是,《数据结构》中所教授的C++程序往往不是现代意义下的C++程序,很多都是C语言的翻版(甚至是古旧的C语言)。放下使用教学语言不说,其教学程序中的编程理念也很古旧,常让热爱新潮的年轻人对这门课程提不起兴趣。其实在C++中,数据结构知识可以帮助我们开发出更快更好更精良的程序。学习好数据结构对于程序员的发展是极其重要的。
1.2.1. Boost.Any
Boost.Any是一个用来存取任意类型信息的库。它很安全,也很高效,而且通吃天下。对于"懒惰"的程序员来说,Any库可以创建一个安全保险的存储空间,保证放入任何类型的数据都不会遗失。
1.2.2. Boost.Array
Boost.Array库是一个强力的数组库。对于C下的数组进行了强力而又安全的照顾。这给我们在std::vector之外多了一种选择。
1.2.3. Boost.Compressed_pair
Boost.Compressed_pair库是对std::pair的强化,从而更节省存储空间。需要解释的是,pair是两个相关联的变量,其可用同时操作,这样有利于解决许多工程问题,比如一个函数返回两个值等。
1.2.4. Boost.Dynamic_bitset
Boost.Dynamic_bitset是对std::bitset的扩展。
1.2.5. Boost.Graph
Boost.Graph是Boost数据类型方面的重要函数库。它包含了许多图论方面的泛型函数,如Dijsktra最短路径算法等。利用该库可以处理图论中相关问题。鉴于其重要性,我们会详细研究一下Boost.Graph的使用(记得有一本书就专论Boost.Graph)。
还记得吗,在学习STL时最吸引人的概念就是迭代子(Iterator)。初学者对于它在循环遍历中的神奇应该深有感触。现在Boost.Iterator库对于原STL的迭代子进行了扩展,使之可以适用于新的迭代类型,且有很多强力操作支持。哇!或许我们应该参考侯捷老师的思路,将Boost数据结构之旅从这里开始呢!
1.2.6. Boost.MultiArray
多年以来,多维数组一直是C++程序员的隐痛。为什么在许多动态语言中可以灵活地挥舞多维数组,而在C++中还要将其手动转换到单维且要小心翼翼防止纬度溢出的错误呢?现在Boost.MultiArray解放了你。不久如此,使用Boost.Multi-index库还可以建立多维索引。"可以DIY一个微型数据库吗?",在Boost的帮助下这似乎不再是一个梦想。
1.2.7. Boost.Range
如果你是一个Python程序员,range概念应该不陌生。现在Boost.Range将它引入C++中。
1.2.8. Boost.Tuple
Boost.Tuple,数据结构中的精灵。不是吗?在Boost.Tuple魔棒下,一切无法组合的事物都聚会了。Tuple的官方解释是特定类型值的定长组合(A tuple is a fixed-size collection of values of specified types.)大白话就是将一堆数据组合起来,但其既不是结构体(Struct),也是类(Class)或者枚举(Enum)。好期待与这个精灵共舞一曲,不是吗?
1.2.9. Boost.Variant
对于Windows下编过OLE(ActiveX)的人来说,Variant是绕不过去的坎。Variant有其迷人的地方,可以随意存放多种类型的值;也有其顽劣之处,使用不好会对其值的真面目无从所知。但不管如何,现在Windows下Variant的使用越来越普及了。Boost.Variant库就是用来对付C++中的Variant问题的。
1.3. Boost库中的函数对象
在C/C++语言中,函数概念占据核心地位。我们不能脱离函数来谈论C/C++语言。但函数的含义是否还是和三四十年前结构化编程思想中的一样呢?答案是否定的。现代编程理论里的函数已经远远拓展了。在函数朴实外表下跳动着年轻的理念。当你在Boost库中漫步的时候,一定会听到它坚实而欢快地跳动声。
1.3.1. Boost.Bind
Boost.Bind,一个神奇伟大的作品。它可以将函数本体与函数输入值进行捆绑。你或许会很奇怪,函数的输入本来就和函数本体在一起调用的呀?看看下面的演示代码吧,是否能感到Bind的魔力:
#include <iostream>
#include "boost/bind.hpp"
void nine_arguments( int i1,int i2,int i3,int i4,
int i5,int i6,int i7,int i8, int i9)
{
std::cout << i1 << i2 << i3 << i4 << i5
<< i6 << i7 << i8 << i9 << '/n';
}
int main()
{
int i1=1,i2=2,i3=3,i4=4,i5=5,i6=6,i7=7,i8=8,i9=9;
(boost::bind(&nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7))
(i1,i2,i3,i4,i5,i6,i7,i8,i9);
}
1.3.2. Boost.Function
Boost.Function可以实现泛化的回调函数。
1.3.3. Boost.Functional
Boost.Functional增强了STL中的Adapter。
1.3.4. Boost.Lambda
Boost.Lambda对于Python用户,Lambda函数是最常用的利器,现在Boost.Lambda也提供C++用户来创建这种仅在调用时才创建的函数的能力(避免小对象的滥用),非常适用于STL算法的函数调用。
1.3.5. Boost.Ref
Boost.Ref则为对象进行引用封装以利于其它对象函数的调用。
1.3.6. Boost.Signals
Boost.Signals则用来创建消息驱动的程序。