注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

boost库简介(转)  

2013-09-06 17:36:23|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++库.

首先,应该先知道boost是一个什么东西,其实这个东西就是一个c++的准标准类库。

那么c++的标准库都有那些,我知道的,也是最近用的最多的,也就是c++的STL(标准模板方法)中的list,vector,map,string什么的。

但最近想试着自已编译一下比特币的源码,才知道原来还有一个boost的库。在网上找了一下,知道了这个类中大概都有一些什么了。

    Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。

    Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。
Boost库由Boost社区组织开发、维护。其目的是为C++程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用,根据该协议,商业的非商业的使用都是允许并鼓励的。
Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。在Boost库的开发中,Boost社区也在这个方向上取得了丰硕的成果。在送审的C++标准库TR1中,有十个Boost库成为标准库的候选方案。在更新的TR2中,有更多的Boost库被加入到其中。从某种意义上来讲,Boost库成为具有实践意义的准标准库。
可下载Boost C++ Libraries[1]安装boost库。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。里面有许多具有工业强度的库,如graph库。
很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。

按照功能分类的Boost库列表:

按照实现的功能,Boost可为大致归入以下20个分类,在下面的分类中,有些库同时归入几种类别。
1.       字符串和文本处理
a)         Conversion
b)         Format
c)         IOStream
d)         Lexical Cast
e)         Regex
f)          Spirit
g)         String Algo
h)         Tokenizer
i)          Wave
j)          Xpressive
2.       容器
a)         Array
b)         Bimap
c)         Circular Buffer
d)         Disjoint Sets
e)         Dynamic Bitset
f)          GIL
g)         Graph
h)         ICL
i)          Intrusive
j)          Multi-Array
k)         Multi-Index
l)          Pointer Container
m)        Property Map
n)         Property Tree
o)         Unordered
p)         Variant
3.       迭代器
a)         GIL
b)         Graph
c)         Iterators
d)         Operators
e)         Tokenizer
4.       算法
a)         Foreach
b)         GIL
c)         Graph
d)         Min-Max
e)         Range
f)          String Algo
g)         Utility
5.       函数对象和高阶编程
a)         Bind
b)         Function
c)         Functional
d)         Functional/Factory
e)         Functional/Forward
f)          Functional/Hash
g)         Lambda
h)         Member Function
i)          Ref
j)          Result Of
k)         Signals
l)          Signals2
m)        Utility
6.       泛型编程

a)         Call Traits
b)         Concept Check
c)         Enable If
d)         Function Types
e)         GIL
f)          In Place Factory, Typed In Place Factory
g)         Operators
h)         Property Map
i)          Static Assert
j)          Type Traits
7.       模板元编程
a)         Function Types
b)         Fusion
c)         MPL
d)         Proto
e)         Static Assert
f)          Type Traits
8.       预处理元编程

a)         Preprocessors
9.       并发编程
a)         Asio
b)         Interprocess
c)         MPI
d)         Thread
10.   数学和数字
a)         Accumulators
b)         Integer
c)         Interval
d)    Math
e)         Math Common Factor
f)          Math Octonion
g)         Math Quaternion
?           h)        Math/Special Functions
i)          Math/Statistical Distributions
j)          Multi-Array
k)         Numeric Conversion
l)          Operators
m)        Random
n)         Rational
o)         uBLAS
11.   排错和测试
a)         Concept Check
b)         Static Assert
c)         Test
12.   数据结构
a)         Any
b)         Bitmap
c)         Compressed Pair
d)         Fusion
e)         ICL
f)          Multi-Index
g)         Pointer Container
h)         Property Tree
i)          Tuple
j)          Uuid
k)         Variant
13.   图像处理

a)         GIL
14.   输入输出
a)         Asio
b)         Assign
c)         Format
d)         IO State Savers
e)         IOStreams
f)          Program Options
g)         Serialization
15.   跨语言混合编程
a)         Python
16.   内存管理

a)         Pool
b)         Smart Ptr
c)         Utility
17.   解析
a)         Spirit
18.   编程接口
a)         Function
b)         Parameter
19.   杂项
a)         Compressed Pair
b)         Conversion
c)         CRC
d)         Date Time
e)         Exception
f)          Filesystem
g)         Flyweight
h)         Lexical Cast
i)          Meta State Machine
j)          Numeric Conversion
k)         Optional
l)          Polygon
m)        Program Options
n)         Scope Exit
o)         Statechart
p)         Swap
q)         System
r)          Timer
s)         Tribool
t)          Typeof
u)         Units
v)         Utility
w)        Value Initialized
20.   编译器问题的变通方案
a)         Compatibility
b)         Config
Boost中比较有名气的有这么几个库:
Regex
正则表达式库
Spirit
LL parser framework,用C++代码直接表达EBNF
Graph
图组件和算法
Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能
concept check
检查泛型编程中的concept
Mpl
用模板实现的元编程框架
Thread
可移植的C++多线程库
Python
把C++类和函数映射到Python之中
Pool
内存池管理
smart_ptr
推荐序
        最近一年我电话面试了数十位 C++ 应聘者,惯用的暖场问题是“工作中使用过 STL 的哪些组件?使用过 Boost 的哪些组件?”。得到的答案大多集中在 vector、map 和  shared_ptr。如果对方是在校学生,我一般会问问 vector 或 map 的内部实现、各种操作的复杂度以及迭代器失效的可能场景。如果是有经验的程序员,我还会追问 shared_ptr 的线程安全性、循环引用的后果及如何避免、weak_ptr 的作用等。如果这些都回答得不错,进一步还可以问问如何实现线程安全的引用计数,如何定制删除动作等等。这些问题让我能迅速辨别对方的 C++ 水平。
我之所以在面试时问到 Boost,是因为其中的许多组件确实可以用于编写可维护的产品代码。Boost 包含近百个程序库,其中不乏具有工程实用价值的佳品。每个人口味与技术背景不一样,对 Boost 的取舍也不一样。就我的个人经验而言,首先可以使用绝对无害的库,例如 noncopyable、scoped_ptr、static_assert 等,这些库的学习和使用都比较简单,容易入手。其次,有些功能自己实现起来并不困难,正好 Boost 里提供了现成的代码,那就不妨一用,比如date_time 和 circular_buffer 等。然后,在新项目中,对于消息传递和资源管理可以考虑采用更加现代的方式,例如用 function/bind 在某些情况下代替虚函数作为库的回调接口、借助shared_ptr实现线程安全的对象回调等等。这二者会影响整个程序的设计思路与风格,需要通盘考虑,如果正确使用智能指针,在现代 C++ 程序里一般不需要出现 delete 语句。最后,对某些性能不佳的库保持警惕,比如 lexical_cast。总之,在项目组成员人人都能理解并运用的基础上,适当引入现成的 Boost 组件,以减少重复劳动,提高生产力。
         Boost 是一个宝库,其中既有可以直接拿来用的代码,也有值得借鉴的设计思路。试举一例:正则表达式库 regex 对线程安全的处理。
早期的 RegEx 类不是线程安全的,它把“正则表达式”和“匹配动作”放到了一个类里边。由于有可变数据,RegEx 的对象不能跨线程使用。如今的 regex 明确地区分了不可变(immutable)与可变(mutable)的数据,前者可以安全地跨线程共享,后者则不行。比如正则表达式本身(basic_regex)与一次匹配的结果(match_results)是不可变的;而匹配动作本身(match_regex)涉及状态更新,是可变的,于是用可重入的函数将其封装起来,不让这些数据泄露给别的线程。正是由于做了这样合理的区分,regex 在正常使用时就不必加锁。
Donald Knuth 在“Coders at Work”一书里表达了这样一个观点:如果程序员的工作就是摆弄参数去调用现成的库,而不知道这些库是如何实现的,那么这份职业就没啥乐趣可言。换句话说,固然我们强调工作中不要重新发明轮子,但是作为一个合格的程序员,应该具备自制轮子的能力。非不能也,是不为也。
         C/C++ 语言的一大特点是其标准库可以用语言自身实现。C 标准库的 strlen、strcpy、strcmp 系列函数是教学与练习的好题材,C++ 标准库的 complex、string、vector 则是类、资源管理、模板编程的绝佳示范。在深入了解 STL 的实现之后,运用 STL 自然手到擒来,并能自动避免一些错误和低效的用法。
对于 Boost 也是如此,为了消除使用时的疑虑,为了用得更顺手,有时我们需要适当了解其内部实现,甚至编写简化版用作对比验证。但是由于 Boost 代码用到了日常应用程序开发中不常见的高级语法和技巧,并且为了跨多个平台和编译器而大量使用了预处理宏,阅读 Boost 源码并不轻松惬意,需要下一番功夫。另一方面,如果沉迷于这些有趣的底层细节而忘了原本要解决什么问题,恐怕就舍本逐末了。
Boost 中的很多库是按泛型编程的范式来设计的,对于熟悉面向对象编程的人而言,或许面临一个思路的转变。比如,你得熟悉泛型编程的那套术语,如concept、model、refinement,才容易读懂 Boost.Threads 的文档中关于各种锁的描述。我想,对于熟悉 STL 设计理念的人而言,这不是什么大问题。
         在某些领域,Boost 不是唯一的选择,也不一定是最好的选择。比如,要生成公式化的源代码,我会首选用脚本语言写一小段代码生成程序,而不用 Boost.Preprocessor;要在 C++ 程序中嵌入领域特定语言,我会首选用 Lua 或其他语言解释器,而不用 Boost.Proto;要用 C++ 程序解析上下文无关文法,我会首选用 ANTLR 来定义词法与语法规则并生成解析器(parser),而不用 Boost.Spirit。总之,使用 Boost 时心态要平和,别较劲去改造 C++ 语言。把它有助于提高生产力的那部分功能充分发挥出来,让项目从中受益才是关键。
         要学习 Boost,除了阅读其官方网站的文档、示例与源码之外,最好能有一本比较全面的中文书在手边随时翻阅。对于不谙英文的开发者,这更是可幸之至。您手上这本《Boost 程序库完全开发指南》是很好的使用指南与参考手册。作者由浅入深地介绍了 Boost 的大部分常用内容,能让读者迅速了解 Boost,并从中找到自己需要的部分。拿到这本书稿之后,我有粗有细地阅读了一遍,总体来看,作者水平很高,也相当务实,对 C++ 和 Boost 的理解与运用很到位,我从这本书学到了不少新知识。为此,我乐于向希望学习 Boost 程序库的开发者推荐这本靠谱的书。
最后发表一下我的看法,其实我还是比较喜欢苹果的Objective-C.因为这里边有很多写的非常好的框架。但是这个东西不是开源库,而只适合在苹果上用。但是这些框架真的很好用。

  评论这张
 
阅读(1079)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018