==============================================================================
接触Boost已经有很多年了,但限于自己的懒惰一直都未能深入研究。今天当再次翻开《Beyond the C++ Standard Library: An Introduction to Boost》,发觉Boost仍然放射着奇异的光芒,指引着我。我知道这次应该跟随着这道光,迈入C++更宏伟更瑰丽的领域,那里有人类理性中最美的部分。
==============================================================================
初探Boost(第一天)
[行前的话]
Boost是一个C++库。由于其制作精良,很有可能会成为继STL后的又一个C++标准库。当然对于一般C++程序员来说,Boost库过于庞大。当第一次登陆www.boost.org网站时,你会不禁迷失于那沟壑纵横的链接页面。而且Boost是一个开放的库,来源于C++不同领域内的专家,代码自风格各异,文档也繁简不同。所以对于一个新手来说,boost是"满汉全席",不仅要有美食的经验可以游走于不同菜系,还要有健壮的胃口进行超负荷工作,才能品出其中万千滋味来。
对于在Windows下成长的一代程序员,Boost库则更显得"面目奇异"--没有统一风格的文档/没有Ctrl+F1的帮助,甚至于没有一个Windows标准的"下一步"安装程序。难怪当他们在VisualStudio/C++Builder中打开Boost库时,会"哇"于其宏伟,"哎"于其不可用。Boost的调试使用对于Windows程序员似乎有点"梦魇"的滋味呢!但要知道这些Boost的构建者可很多比Windows的岁数大,而且很多从未在Windows平台下工作过,对于他们来说Windows是一个商业产品,而不是计算机软件的全部。
基于此,我希望此次我的Boost旅程可以带着Windows平台下的C++程序员们,在Boost的海洋边看看浪花,嬉戏水,或到海里游上一程。
============================================================================== 总揽Boost,看啦海中的几座小岛
"C++语言是一个创举",这句话从上世纪八十年代一直流传至今。但今天的新一代程序员,在看过Java/C#等语言后再回眸C++,似乎总有点瞧不起。"那个没有string类型的老旧语言"/"那个没有垃圾回收(GC)的咚咚"……,当他们在C++中面对在Java/C#中可以轻松解决的字符处理问题时,抓狂与抱怨铺天盖地而来。噢,先甭抓了,否则三十岁未到一定谢顶。在C++中也可以轻松面对字符处理。这不是天方夜谭,虽然C++语言没有过多地涉及字符处理的技术细节,但在STL和Boost中都有很好的函数库可以使用,其方便快捷一点也不逊色于Java/C#。所以我们的Boost总揽先看看Boost中的字符处理。
Boost.Regex是Boost中一个解决正则表达式的库。正则表达式(Regular Expression)是一组特定的字符标示串,其可用于对字符串进行筛选过滤搜索定位等复杂操作。正则表达式最早广泛应用于Perl语言中--其作为文本处理的利器在WWW网的婴儿期做出巨大的贡献。后来在许多语言中,正则表达式作为标准库成为语言的一部分,比如微软公司的C#语言中就包含了一个强大的Regular库(它是.Net框架库的一部分)。Boost.Regex赋予C++程序员控制正则表达式的能力,这样其可从容面对各种复杂的文本处理问题了。Boost.Regex将是我们要详细学习的一个库。
如果说Boost.Regex是普通C++程序员文本处理的匕首,那么Boost.Spirit则是计算科学专家的宝剑。它主要解决如何实现语言分析功能,即命令行级的文本分析器。在Spirit的帮助下编写一个程序预编译器应该不是件"难"事。但面对它,我们只浏览一遍,因为对于Boost的初学者来说,Spirit所涉及的计算科学知识实在是太深了。
Boost.String_algo是一组string相关处理的函数库,包括转换/缩减/切割等操作,这是最常用的字符串处理库。
Boost.Tokenizer是将一串字符切割成多个记号(Token),在串行传输与控制中将起重要的作用。
鉴于上述的分析,字符处理小岛上的诸多山峰中我们会仰望Spirit峰,攀登Regex/String_algo峰,随便逛逛Tokenizer峰。
==============================================================================
《数据结构》是每个计算机学科的基础课程,目前该课程在国内的教学语言一般为C++。但很可惜的是,《数据结构》中所教授的C++程序往往不是现代意义下的C++程序,很多都是C语言的翻版(甚至是古旧的C语言)。放下使用教学语言不说,其教学程序中的编程理念也很古旧,常让热爱新潮的年轻人对这门课程提不起兴趣。其实在C++中,数据结构知识可以帮助我们开发出更快更好更精良的程序。学习好数据结构对于程序员的发展是极其重要的。好了,我们甭再老生常谈,看看Boost中的另一个小岛给予我们哪些数据结构方面的启迪。
Boost.Any是一个用来存取任意类型信息的库。它很安全,也很高效,而且通吃天下。对于"懒惰"的程序员来说,Any库可以创建一个安全保险的存储空间,保证放入任何类型的咚咚都不会遗失。
顾名思义,Boost.Array库是一个强力的数组库。对于C下的数组进行了强力而又安全的照顾。这给我们在std::vector之外多了一种选择。
Boost.Compressed_pair库是对std::pair的强化,从而更节省存储空间。需要解释的是,pair是两个相关联的变量,其可用同时操作,这样有利于解决许多工程问题,比如一个函数返回两个值等。
Boost.Dynamic_bitset是对std::bitset的扩展。
Boost.Graph是Boost数据类型方面的重要函数库。它包含了许多图论方面的泛型函数,如Dijsktra最短路径算法等。利用该库可以处理图论中相关问题。鉴于其重要性,我们会详细研究一下Boost.Graph的使用(记得有一本书就专论Boost.Graph)。
还记得吗,在学习STL时最吸引人的概念就是迭代子(Iterator)。初学者对于它在循环遍历中的神奇应该深有感触。现在Boost.Iterator库对于原STL的迭代子进行了扩展,使之可以适用于新的迭代类型,且有很多强力操作支持。哇!或许我们应该参考侯捷老师的思路,将Boost数据结构之旅从这里开始呢!
多年以来,多维数组一直是C++程序员的隐痛。为什么在许多动态语言中可以灵活地挥舞多维数组,而在C++中还要将其手动转换到单维且要小心翼翼防止纬度溢出的错误呢?现在Boost.MultiArray解放了你。不久如此,使用Boost.Multi-index库还可以建立多维索引。"可以DIY一个微型数据库吗?",在Boost的帮助下这似乎不再是一个梦想咯。
如果你是一个Python程序员,range概念应该不陌生。现在Boost.Range将它引入C++中。
Boost.Tuple,数据结构中的精灵。不是吗?在Boost.Tuple魔棒下,一切无法组合的事物都聚会了。Tuple的官方解释是特定类型值的定长组合(A tuple is a fixed-size collection of values of specified types.)大白话就是将一堆数据组合起来,但其既不是结构体(Struct),也是类(Class)或者枚举(Enum)。好期待与这个精灵共舞一曲,不是吗?
对于Windows下编过OLE(ActiveX)的人来说,Variant是绕不过去的坎。Variant有其迷人的地方,可以随意存放多种类型的值;也有其顽劣之处,使用不好会对其值的真面目无从所知。但不管如何,现在Windows下Variant的使用越来越普及了。Boost.Variant库就是用来对付C++中的Variant问题的。
我想如果一个学习《数据结构》的学生,在用STL学习了基本的数据结构理论后,将目光放在Boost上,应该会有很大的能力提高。
==============================================================================
在C/C++语言中,函数概念占据核心地位。我们不能脱离函数来谈论C/C++语言。但函数的含义是否还是和三四十年前结构化编程思想中的一样呢?答案是否定的。现代编程理论里的函数已经远远拓展了。在函数朴实外表下跳动着年轻的理念。当你在Boost库中漫步的时候,一定会听到它坚实而欢快地跳动声。
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);
}



Boost.Function可以实现泛化的回调函数,Boost.Functional则增强了STL中的Adapter。对于Python用户,Lambda函数是最常用的利器,现在Boost.Lambda也提供C++用户来创建这种仅在调用时才创建的函数的能力(避免小对象的滥用),非常适用于STL算法的函数调用。而Boost.Ref则为对象进行引用封装以利于其它对象函数的调用。Boost.Signals则用来创建消息驱动的程序。
==============================================================================

相关文章:

  • 2021-11-21
  • 2022-12-23
  • 2021-04-19
  • 2021-09-03
  • 2021-06-25
  • 2021-10-23
  • 2021-10-28
  • 2022-12-23
猜你喜欢
  • 2021-10-11
  • 2022-12-23
  • 2021-09-04
  • 2022-01-10
  • 2021-07-07
  • 2021-12-18
  • 2021-07-11
相关资源
相似解决方案