跳转到内容

C++ 编程/库/Boost

来自 Wikibooks,开放世界中的开放书籍

Boost 项目 (https://boost.ac.cn/) 提供免费的 同行评审开源 ,这些库扩展了 C++ 的功能。大多数库都在 Boost 软件许可 下获得许可,该许可旨在允许 Boost 与开源和 闭源 项目一起使用。

Boost 的许多创始人都参与了 C++ 标准 委员会,并且几个 Boost 库已被接受纳入 技术报告 1C++0x。尽管 Boost 是由 C++ 标准委员会库工作组的成员发起的,但参与范围已扩大到包括来自整个 C++ 社区的数千名程序员。

重点是与 C++ 标准库协同工作的库。这些库针对广泛的 C++ 用户和应用程序领域,并被数千名程序员定期使用。它们从通用库(如 SmartPtr)到操作系统抽象(如 FileSystem),再到主要针对其他库开发人员和高级 C++ 用户的库(如 MPL)。

另一个目标是建立“现有实践”并提供参考实现,以便 Boost 库适合最终标准化。十个 Boost 库将被包含在 C++ 标准委员会 的即将发布的 C++ 标准库技术报告 中,作为成为未来 C++ 标准的一部分的步骤。

为了确保效率和灵活性,Boost 广泛使用 模板。Boost 一直是 C++ 中对 泛型编程元编程 进行广泛研究和工作的来源。

按类别列出的库

并发编程
... TODO
  • 算法
  • 并发编程 (线程)
  • 容器
    • array - 使用 STL 容器语义管理固定大小的数组
    • Boost 图形库 (BGL) - 泛型图形容器、组件和算法
    • multi-array - 简化 N 维数组的创建
    • 多索引容器 - 具有内置索引的容器,允许不同的排序和访问语义
    • 指针容器 - 模仿大多数标准 STL 容器的容器,允许透明管理指向值的指针
    • 属性映射 - 以概念形式提供的接口规范,以及用于将键值映射到对象的通用接口
    • variant - 一个安全且通用的基于堆栈的对象容器,允许高效地存储和访问可以从一组类型中选择的一种类型对象,这些类型必须在编译时指定。
  • 正确性和 测试
    • 概念检查 - 允许强制执行实际模板参数要求(概念)
    • 静态断言 - 编译时断言支持
    • Boost 测试库 - 一组用于编写测试程序、将测试组织成测试用例和测试套件以及控制其运行时执行的匹配组件
  • 数据结构
  • 函数对象和 高阶编程
    • bindmem_fn - 用于函数、函数对象、函数指针和成员函数的通用绑定器
    • function - 用于延迟调用的函数对象包装器。此外,还提供了一种通用的回调机制
    • functional - 对 C++ 标准库中指定的函数对象适配器的增强,包括
    • hash - C++ 技术报告 1 (TR1) 中指定的散列函数对象的实现。可以用作无序关联容器的默认散列函数
    • lambda - 本着 lambda 抽象 的精神,允许在调用站点定义小的匿名函数对象并对这些对象进行操作,使用占位符,尤其是在使用来自算法的延迟回调时。
    • ref - 提供用于增强标准 C++ 引用功能的实用程序类模板,尤其是在使用泛型函数时
    • result_of - 帮助确定调用表达式的类型
    • Signals2 - 托管的信号和槽回调实现
  • 泛型编程
  • 图形
  • 输入/输出
  • 跨语言支持(针对 Python
  • 迭代器
    • 迭代器
    • operators - 用于帮助为用户定义的迭代器和可以参与算术运算的类的重载运算符定义的类模板。
    • tokenizer - 提供对包含在序列中的令牌集的视图,使其看起来像具有迭代器访问的容器
  • 数学和数值
  • 内存
    • pool - 提供一种简单的基于隔离存储的内存管理方案
    • smart_ptr - 一组具有不同被指向对象管理语义的智能指针类模板
      • scoped_ptr - 拥有被指向对象(单个对象)
      • scoped_array - 类似 scoped_ptr,但用于数组
      • shared_ptr - 可能与其他 shared_ptr 共享指针。当最后一个指向它的 shared_ptr 被销毁时,被指向对象被销毁
      • shared_array - 类似 shared_ptr,但用于数组
      • weak_ptr - 提供对由 shared_ptr 管理的对象的“弱”引用
      • intrusive_ptr - 类似于 shared_ptr,但使用被指向对象提供的引用计数
    • utility - 各种支持类,包括
      • 从成员派生基类 - 为需要在其自己的(即派生类)构造函数的初始化列表中初始化基类成员的类提供解决方法
      • checked delete - 检查是否尝试使用指向不完整类型的指针销毁对象或对象数组
      • next 和 prior 函数 - 允许更轻松地向前或双向迭代器移动,尤其是在这种移动的结果需要存储在单独的迭代器中时(即,不应更改原始迭代器)。
      • noncopyable - 允许禁止复制构造和复制赋值。
      • addressof - 允许获取对象的实际地址,在这个过程中绕过 operator&() 的任何重载。
      • result_of - 帮助确定调用表达式的类型
  • 其他
  • 解析器
  • 预处理器元编程
  • 字符串 和文本处理
    • lexical_cast - 类型转换到/从文本
    • format - 根据格式字符串进行类型安全的参数格式化。
    • iostreams - C++ 流和流缓冲区辅助,用于新的源/接收器,过滤器框架。
    • regex - 支持正则表达式。
    • Spirit - 面向对象的递归下降解析器生成器框架。
    • 字符串算法 - 与字符串相关的各种算法的集合。
    • tokenizer - 允许将字符串或其他字符序列划分为 标记
    • wave - 标准一致的强制 C99 / C++ 预处理器功能的实现,打包在一个易于使用的接口后面。
  • 模板元编程
    • mpl - 一个通用目的的高级元编程框架,包括编译时算法、序列和元函数。
    • 静态断言 - 编译时断言支持
    • 类型特征 - 定义类型基本属性的模板。
  • 针对损坏编译器的解决方法

当前的 Boost 版本包含 87 个独立的库,包括以下三个:

noncopyable

[edit | edit source]

boost::noncopyable实用程序类 确保类的对象永远不会被复制

class C : boost::noncopyable
{
  ...
};

线性代数 - uBLAS

[edit | edit source]

Boost 包含 uBLAS 线性代数 库(更快的替代库包括 armadillo 和 eigen),并支持 BLAS,用于向量和矩阵。 uBlas 支持各种线性代数运算,并与一些广泛使用的数值库绑定,如 ATLAS、BLAS 和 LAPACK。

  • 示例显示如何将向量与矩阵相乘
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <iostream>

using namespace boost::numeric::ublas;

/* "y = Ax" example */
int main () 
{
      vector<double> x(2);
      x(0) = 1; x(1) = 2;
 
      matrix<double> A(2,2);
      A(0,0) = 0; A(0,1) = 1;
      A(1,0) = 2; A(1,1) = 3;

      vector<double> y = prod(A, x);

      std::cout << y << std::endl;
      return 0;
}

生成随机数 - Boost.Random

[edit | edit source]

Boost 提供了独立于分布的 伪随机数生成器 和独立于 PRNG 的概率分布,它们组合在一起构建一个具体的生成器。

#include <boost/random.hpp>
#include <ctime>

using namespace boost;

double SampleNormal (double mean, double sigma)
{
    // Create a Mersenne twister random number generator
    // that is seeded once with #seconds since 1970
    static mt19937 rng(static_cast<unsigned> (std::time(0)));

    // select Gaussian probability distribution
    normal_distribution<double> norm_dist(mean, sigma);

    // bind random number generator to distribution, forming a function
    variate_generator<mt19937&, normal_distribution<double> >  normal_sampler(rng, norm_dist);

    // sample from the distribution
    return normal_sampler();
}

有关更多详细信息,请参阅 Boost 随机数库

多线程 - Boost.Thread

[edit | edit source]

演示线程创建的示例代码

#include <boost/thread/thread.hpp>
#include <iostream>

using namespace std;

void hello_world() 
{
  cout << "Hello world, I'm a thread!" << endl;
}

int main(int argc, char* argv[]) 
{
  // start two new threads that calls the "hello_world" function
  boost::thread my_thread1(&hello_world);
  boost::thread my_thread2(&hello_world);

  // wait for both threads to finish
  my_thread1.join();
  my_thread2.join();
  
  return 0;
}

另请参阅 使用 Boost 进行线程处理 - 第 1 部分:创建线程

线程锁定

[edit | edit source]

使用互斥锁强制对函数进行独占访问的示例用法

#include <iostream>
#include <boost/thread.hpp>

void locked_function ()
{
    // function access mutex
    static boost::mutex m;
    // wait for mutex lock
    boost::mutex::scoped_lock lock(m);

    // critical section
    // TODO: Do something

    // auto-unlock on return
}

int main (int argc, char* argv[]) 
{
    locked_function();
    return 0;
}

属性的读/写锁定的示例

#include <iostream>
#include <boost/thread.hpp>

/** General class for thread-safe properties of any type. */
template <class T>
class lock_prop : boost::noncopyable {
public:
    lock_prop () {}

    /** Set property value. */
    void operator = (const T & v) {
        // wait for exclusive write access
        boost::unique_lock<boost::shared_mutex> lock(mutex);

        value = v;
    }

    /** Get property value. */
    T operator () () const {
        // wait for shared read access
        boost::shared_lock<boost::shared_mutex> lock(mutex);

        return value;
    }

private:
    /// Property value.
    T                           value;
    /// Mutex to restrict access
    mutable boost::shared_mutex mutex;
};

int main () {
    // read/write locking property
    lock_prop<int> p1;
    p1 = 10;
    int a = p1();

    return 0;
}
华夏公益教科书