首页 > 其他分享 >boost库简介(转)

boost库简介(转)

时间:2022-09-28 14:05:09浏览次数:52  
标签:简介 编程 C++ 标准 boost 线程 Boost ptr


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.因为这里边有很多写的非常好的框架。但是这个东西不是开源库,而只适合在苹果上用。但是这些框架真的很好用。


标签:简介,编程,C++,标准,boost,线程,Boost,ptr
From: https://blog.51cto.com/u_13760719/5719214

相关文章

  • CefSharp简介
    引言在WPF开发中,经常会有混合开发的需求,即在WPF中加载网页,目前最常用也是最流行的方式是CefSharp,它的功能非常强大,可以提供较为完善的开发和使用体验,但是CefSharp也有一定......
  • HTML——简介-入门
    W3C标准:网页主要由三部分组成结构:HTML表现:CSS行为:JavaScript HTML快速入门  1、新建文本文件,后缀改为.html  2、编写HTML结构标签(不区分大小写)     ......
  • 3.TCP-IP & Linux 模型简介
    Dearall,  更新一节Linux网络驱动视频——3.TCP-IP&Linux模型简介,下节课开始正式编写driver。  B站链接:https://www.bilibili.com/video/BV1DG4y1s7ad/?vd_......
  • P2(从2开始的) MAVEN的简介
    注:笔记内容摘抄自视频,侵权删!3项目构建工具摘要:新型公司使用grandle4Maven四大特性4.1依赖管理系统听不太懂,大概就是下载jar包只需要配置,不需要手动下载4.2多模......
  • Ansible简介
    Ansible是一种常用的自动运维化工具,基于python开发,分布式,无需客户端,轻量级,配置语言采用YAML。Ansible 的特性:1.模块化:调用特定的模块,完成特殊的任务。2.Paramiko(......
  • nextTick简介
    在说nextTick之前,我们先介绍一下这节课案例的需求,我们还是有一个数组,里面有几个超级英雄,把他们渲染到了一个ul里,我们现在要获取这个ul的高度<template><div><ul......
  • 知识点2-1 B+树(5)myISAM简介
    myISAM简介MyISAM的B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。这里的索引都是非聚簇索引......
  • 机器学习简介
    1.人工智能发展必备三要素数据、算法、计算力(CPU\GPU\TPU)CPU、GPU对比:CPU适合IO密集型任务;GPU适合计算密集型任务。2.人工智能、机器学习、深度学习关系人工智......
  • pycharm简介及python基础知识
    1、昨日内容回顾计算机五大组成部分(补充)控制器与运算器合称CPU。储存器分内存(临时)与外存(长久)。计算机三大核心硬件CPU,计算机的中枢神经,程序运行必须依靠CPU。内......
  • Splunk简介,部署,使用
    简介Splunk是一款功能强大,功能强大且完全集成的软件,用于实时企业日志管理,可收集,存储,搜索,诊断和报告任何日志和机器生成的数据,包括结构化,非结构化和复杂的多行应用程序日志......