logo资料库

The Boost C++ Libraries.pdf

第1页 / 共210页
第2页 / 共210页
第3页 / 共210页
第4页 / 共210页
第5页 / 共210页
第6页 / 共210页
第7页 / 共210页
第8页 / 共210页
资料共210页,剩余部分请下载后查看
第1章简介
1.1.C++与Boost
1.2.开发过程
1.3.安装
1.4.概述
第2章智能指针
2.1.概述
2.2.RAII
2.3.作用域指针
2.4.作用域数组
第3章函数对象
第4章事件处理
第5章字符串处理
第6章多线程
第7章异步输入输出
第8章进程间通讯
第9章文件系统
第10章日期与时间
第11章序列化
第12章词法分析器
第13章容器
第14章数据结构
第15章错误处理
第16章类型转换操作符
Boost C++ 库 目录 • 第 1 章 简介 • 第 2 章 智能指针 • 第 3 章 函数对象 • 第 4 章 事件处理 • 第 5 章 字符串处理 • 第 6 章 多线程 • 第 7 章 异步输入输出 • 第 8 章 进程间通讯 • 第 9 章 文件系统 • 第 10 章 日期与时间 • 第 11 章 序列化 • 第 12 章 词法分析器 • 第 13 章 容器 • 第 14 章 数据结构 • 第 15 章 错误处理 • 第 16 章 类型转换操作符 该书采用 Creative Commons License 授权 本书的中文版由 Albert Lai, Jerry Guo, Kun Zeng, Liangfu Chen (主页), Cui Wei 和 Rui Shi 翻译。 内容 你将学到些什么 本书是对 Boost C++ 库的介绍,Boost 库通过加入一些在实践中非常有用的函数对 C++ 标 准进行了补充。由于 Boost C++ 库是基于 C++ 标准的,所以它们是使用最先进的 C++ 来 实现的。它们是平台独立的,并由于有一个大型的开发人员社区,它可以被包括 Windows 和 Linux 在内的许多操作系统所支持。 Boost C++ 库可以提升你作为一个 C++ 开发人员的生产力。例如,你可以从智能指针中受 益,帮助你写出更可靠的代码,或者使用某个库来开发平台独立的网络应用。因为多数 Boost C++ 库正被收录进下一个版本的 C++ 标准,所以你可以从今天就开始作好准备。 要求 你应该懂得些什么 因为 Boost C++ 库是基于且扩展了 C++ 标准,所以你应该懂得 C++ 标准。你应该了解且 能够使用容器、迭代器及算法,最好有听说过以下概念:RAII,函数对象,或是谓词。你越 是了解 C++ 标准,就越能从 Boost C++ 库中受益。
版权 © 2008-2010 Boris Schäling 版本1.0 / 19 八月 2010 http://zh.highscore.de/cpp/boost/ B o o s t C + + 库 目录 第 1 章 简介
目录 • • • • 1.1 C++ 与 Boost 1.2 开发过程 1.3 安装 1.4 概述 该书采用 Creative Commons License 授权 1.1. C++ 与 Boost Boost C++ 库 是一组基于 C++标准的现代库。 其源码按 Boost Software License 来发布, 允许任何人自由地使用、修改和分发。 这些库是平台独立的,且支持大多数知名和不那么 知名的编译器。 Boost 社区负责开发和发布 Boost C++ 库。 社区由一个很大的 C++开发人员群组组成,这 些开发人员来自于全球,他们通过网站 www.boost.org 以及几个邮件列表相互协调。 社区 的使命是开发和收集高质量的库,作为 C++标准的补充。 那些被证实有价值且对于 C++应用 开发非常重要的库,将会有很大机会在某天被纳入 C++标准中。 Boost 社区在1998年左右出现,当时刚刚发布了 C++标准的第一个版本。 从那时起,社区 就不断地扩大,现在已成为 C++标准化工作中的一个重要角色。 虽然 Boost 社区与标准化 委员会之间没有直接的关系,但有部分开发者同时活跃于两方。 下一个版本的 C++标准很 大可能在2011年通过,其中将扩展一批库,这些库均起源于 Boost 社区。 要增强 C++项目的生产力,除了 C++标准以外,Boost C++ 库是一个不错的选择。 由于当前 版本的 C++标准在2003年修订之后,C++又有了新的发展,所以 Boost C++ 库提供了许多新 的特性。 由于有了 Boost C++ 库,我们无需等待下一个版本的 C++标准,就可以立即享用 C++演化中取得的最新进展。 Boost C++ 库具有良好的声誉,这基于它们的使用已被证实是非常有价值的。 在面试中询 问关于 Boost C++ 库的知识是不常见的,因为知道这些库的开发人员通常也清楚 C++的最 新创新,并且能够编写和理解现代的 C++代码。 1.2. 开发过程 正是因为大量的独立开发者和组织的支持和参与,才使用 Boost C++ 库的开发成为可能。 由于 Boost 只接受满足以下条件的库:解决了真实存在的问题、表现出令人信服的设计、 使用现代 C++来开发且以可理解的方式提供文档,所以每一个 Boost C++ 库的背后都有大 量的工作。 C++ 开发者都可以加入到 Boost 社区中,并提出自己的新库。 但是,要将一个想法变成一 个 Boost C++ 库,需要投入大量的时间和努力。 其中最重要的是在 Boost 邮件列表中与 其他开发者及潜在用户讨论需求和可能的解决方案。
除了这些好象不知从何处冒出来的新库以外,也可以提名一些已有的 C++ 库进入 Boost。 不过,由于对这些库的要求是与专门为 Boost 开发的库一样的,所以可能需要对它们进行 大量的修改。 一个库是否被接纳入 Boost,取决于评审过程的结果。 库的开发者可以申请评审,这通常 需要10天的时间。 在这段时间内,其他开发者被邀请对这个库进行评分。 基于正面和负面 评价的数量,评审经理将决定该库是否被接纳进入 Boost。 由于有些开发者是在评审阶段 才首次公开库的代码,所以在评审期间被要求对库进行修改并不罕见。 如果一个库是因为技术原因被拒绝,那么它还有可能在修改之后对更新后的版本申请新的评 审。 但是,如果一个库是因为不能解决实际问题或未能提供令人信服的解决方案而被拒绝, 那么再一次评审也很可能会被拒绝。 因为可能随时接纳新的库,所以 Boost C++ 库会每三个月发布一次新版本。本书所涉及的 库均基于2010年2月发布的 1.42.0 版本。 请注意,另外还有一些库已被接纳,但尚未成为 Boost C++ 库发布版的一部分。在被包含 进发布版之前,它们必须手工安装。 1.3. 安装 Boost C++ 库均带有源代码。其中大多数库只包含头文件,可以直接使用,但也有一些库需 要编译。 为了尽可能容易安装,可以使用 Boost Jam 进行自动安装。 无需逐个库进行检 查和编译,Boost Jam 自动安装整个库集。 它支持许多操作系统和编译器,并且知道如何 基于适当的配置文件来编译单个库。 为了在 Boost Jam 的帮助下自动安装,要使用一个名为 bjam 的应用程序,它也带有源代 码。 对于某些操作系统,包括 Windows 和 Linux,也有预编译好的 bjam 二进制文件。 为了编译 bjam 本身,要执行一个名为 build 的简单脚本,它也为不同的操作系统提供了 源代码。 对于 Windows,它是批处理文件 build.bat。 对于 Linux,文件名为 build.sh。 如果执行 build 时不带任何命令行选项,则该脚本尝试找到一个合适的编译器来生成 bjam。 通过使用命令行开关,称为 toolset,可以选择特定的编译器。 对于 Windows,build 支持 toolsets vc7, vc8 和 vc9,可以选择不同版本的 Microsoft C++ 编译器。 要从 Visual Studio 2008 的 C++编译器编译 bjam,需要指定命令 build vc9。对于 Linux,支 持 toolsets gcc 和 intel-linux,分别选定 GCC 和 Intel 的 C++编译器。 应用程序 bjam 必须复制到本地的 Boost 目录 - 不论它是编译出来的还是下载的预编译 二进制文件。然后就可以不带任何命令行选项地执行 bjam,编译并安装 Boost C++ 库。 由 于缺省选项 - 在这种情况下所使用的 - 并不一定是最好的选择,所以以下列出最重要的几 个选项供参考: 声明 stage 或 install 可以指定 Boost C++ 库是安装在一个名为 stage 的子目录下,还 是在系统范围内安装。 "系统范围"的意义取决于操作系统。 在 Windows 中,目标目录是 C:\Boost;而在 Linux 中则是 /usr/local。 目标目录也可以用 --prefix 选项明确指出。 如果不带任何命令行选项执行 bjam,则它会自己搜索一个合适的 C++编译器。 可以通过
--toolset 选项来指定一个特定的编译器。 要在 Windows 中指定 Visual Studio 2008 的 Microsoft C++ 编译器,bjam 执行时要带上 --toolset=msvc-9.0 选项。 要在 Linux 中 指定 GCC 编译器,则要给出 --toolset=gcc 选项。 命令行选项 --build-type 决定了创建何种方式的库。 缺省情况下,该选项设为 minimal, 即只创建发布版。 对于那些想用 Visual Studio 或 GCC 构建他们项目的调试版的开发者 来说,可能是一个问题。 因为这些编译器会自动尝试链接调试版的 Boost C++ 库,这样就 会给出一个错误信息。 在这种情况下,应将 --build-type 选项设为 complete,以同时生 成 Boost C++ 库的调试版和发布版,当然,所需时间也会更长一些。 要用 Visual Studio 2008 的 C++编译器同时生成 Boost C++ 库的调试版和发布版,并将 它 们 安 装 在 目 录 D:\Boost 中 , 应 执 行 的 命 令 是 bjam --toolset=msvc-9.0 --build-type=complete --prefix=D:\Boost install. 要在 Linux 中使用缺省目录创建 它们,则要执行的命令是 bjam --toolset=gcc --build-type=complete install. 其它多个命令行选项可用于指定如何编译 Boost C++ 库的一些细节设定。 我通常在 Windows 下 使 用 以 下 命 令 : bjam --toolset=msvc-9.0 debug release link=static runtime-link=shared install. debug 和 release 使 得 调 试 版 和 发 布 版 均 被 生 成 。 link=static 则只创建静态库。runtime-link=shared 则是指定 C++ 运行时库是动态链接 的,这是在 Visual Studio 2008 中对 C++项目的缺省设置。 1.4. 概述 Boost C++ 库的 1.42.0 版本包含了超过90个库,本书只详细讨论了以下各库: 表 1.1. 讨论到 C++ 标 的库Boost C++ 准 库 简要说明 Boost.Any Boost.Any 提供了一个名为 boost::any 的数据类型,可以存放任 意的类型。 例如,一个类型为 boost::any 的变量可以先存放一个 int 类型的值,然后替换为一个 std::string 类型的字符串。 Boost.Array Boost.Asio TR1 TR2 Boost.Array 可以把 C++ 数组视同 C++ 标准的容器。 Boost.Asio 可用于开发异步处理数据的应用,如网络应用。 Boost.Bimap Boost.Bimap 提 供 了 一 个 名 为 boost::bimap 的 类 , 它 类 似 于 std::map. 主要的差别在于 boost::bimap 可以同时从键和值进行 搜索。 Boost.Bind TR1 Boost.Bind 是一种适配器,可以将函数作为模板参数,即使该函数 的签名与模板参数不兼容。 Boost.Conversi Boost.Conversion 提供了三个转型操作符,分别执行向下转型、交 on 叉转型,以及不同数字类型间的值转换。 Boost.DateTime Boost.DateTime 可用于以灵活的格式处理、读入和写出日期及时间
值。 Boost.Exceptio Boost.Exception 可以在抛出的异常中加入额外的数据,以便在 n catch 处理中提供更多的信息。 这有助于更容易地调试,以及对异 常情况更好地作出反应。 Boost.Filesyst TR2 Boost.Filesystem 提供了一个类来处理路径信息,还包含了几个访 em 问文件和目录的函数。 Boost.Format Boost.Format 以一个类型安全且可扩展的 boost::format 类替代 了 std::printf() 函数。 Boost.Function TR1 Boost.Function 简化了函数指针的定义。 Boost.Interpro Boost.Interprocess 允许多个应用通过共享内存以快速、高效的方 cess 式进行通信。 Boost.Lambda Boost.Lambda 可以定义匿名的函数。 代码被内联地声明和执行, 避免了单独的函数调用。 Boost.Multiind Boost.Multiindex 定义了一些新的容器,它们可以同时支持多个接 ex 口,如 std::vector 和 std::map 的接口。 Boost.NumericC Boost.NumericConversion 提供了一个转型操作符,可以安全地在 onversion 不同的数字类型间进行值转换,不会生成上溢出或下溢出的条件。 Boost.PointerC Boost.PointerContainer 提供了专门为动态分配对象进行优化的 ontainer 容器。 Boost.Ref TR1 Boost.Ref 的适配器可以将不可复制对象的引用传给需要复制的函 数。 Boost.Regex TR1 Boost.Regex 提供了通过正则表达式进行文本搜索的函数。 Boost.Serializ 通过 Boost.Serialization,对象可以被序列化,如保存在文件中, ation 并在以后重新导入。 Boost.Signals Boost.Signal 是一个事件处理的框架,基于所谓的 signal/slot 概念。 函数与信号相关联并在信号被触发时自动被调用。 Boost.SmartPoi TR1 Boost.SmartPoiners 提供了多个智能指针,简化了动态分配对象的 ners 管理。 Boost.Spirit Boost.Spirit 可以用类似于 EBNF (扩展巴科斯范式)的语法生成 词法分析器。 Boost.StringAl Boost.StringAlgorithms 提供了多个独立的函数,以方便处理字符 gorithms 串。 Boost.System TR2 Boost.System 提供了一个处理系统相关或应用相关错误代码的框 架。 Boost.Thread C++0x Boost.Thread 可用于开发多线程应用。 Boost.Tokenize Boost.Tokenizer 可以对一个字符串的各个组件进行迭代。 r
Boost.Tuple TR1 Boost.Tuple 提供了泛化版的 std::pair,可以将任意数量的数据 组在一起。 Boost.Unordere TR1 Boost.Unordered 扩 展 了 C++ 标 准 的 容 器 , 增 加 了 d boost::unordered_set 和 boost::unordered_map. Boost.Variant Boost.Variant 可以定义多个数据类型,类似于 union, 将多个数 据类型组在一起。 Boost.Variant 比 union 优胜的地方在于它可 以使用类。 Technical Report 1 是在2003年发布的,有关 C++0x 标准和 Technical Report 2 的一些 细节才能反映当前的状态。由于无论是下一个版本的 C++ 标准,还是 Technical Report 2 都尚未被批准,所以在往后的时间里,它们仍然可能会有改变。 版权 © 2008-2010 Boris Schäling 第 2 章 智能指针 目录 • • • • • • • • • • 2.1 概述 2.2 RAII 2.3 作用域指针 2.4 作用域数组 2.5 共享指针 2.6 共享数组 2.7 弱指针 2.8 介入式指针 2.9 指针容器 2.10 练习 该书采用 Creative Commons License 授权
2.1. 概述 1998年修订的第一版 C++标准只提供了一种智能指针: std::auto_ptr 。 它基本上就像是 个普通的指针: 通过地址来访问一个动态分配的对象。 std::auto_ptr 之所以被看作是智 能指针,是因为它会在析构的时候调用 delete 操作符来自动释放所包含的对象。 当然这 要求在初始化的时候,传给它一个由 new 操作符返回的对象的地址。 既然 std::auto_ptr 的析构函数会调用 delete 操作符,它所包含的对象的内存会确保释放掉。 这是智能指针 的一个优点。 当和异常联系起来时这就更加重要了:没有 std::auto_ptr 这样的智能指针,每一个动态 分配内存的函数都需要捕捉所有可能的异常,以确保在异常传递给函数的调用者之前将内存 释放掉。 Boost C++ 库 Smart Pointers 提供了许多可以用在各种场合的智能指针。 2.2. RAII 智能指针的原理基于一个常见的习语叫做 RAII :资源申请即初始化。 智能指针只是这个 习语的其中一例——当然是相当重要的一例。 智能指针确保在任何情况下,动态分配的内 存都能得到正确释放,从而将开发人员从这项任务中解放了出来。 这包括程序因为异常而 中断,原本用于释放内存的代码被跳过的场景。 用一个动态分配的对象的地址来初始化智 能指针,在析构的时候释放内存,就确保了这一点。 因为析构函数总是会被执行的,这样 所包含的内存也将总是会被释放。 无论何时,一定得有第二条指令来释放之前另一条指令所分配的资源时,RAII 都是适用的。 许多的 C++ 应用程序都需要动态管理内存,因而智能指针是一种很重要的 RAII 类型。 不 过 RAII 本身是适用于许多其它场景的。 #include class windows_handle { public: windows_handle(HANDLE h) : handle_(h) { } ~windows_handle() { } CloseHandle(handle_); HANDLE handle() const {
分享到:
收藏