C++ 编程/库/Boost
该 Boost 项目 (https://boost.ac.cn/) 提供免费的 同行评审、开源 库,这些库扩展了 C++ 的功能。大多数库都在 Boost 软件许可 下获得许可,该许可旨在允许 Boost 与开源和 闭源 项目一起使用。
Boost 的许多创始人都参与了 C++ 标准 委员会,并且几个 Boost 库已被接受纳入 技术报告 1 的 C++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 - 一个安全且通用的基于堆栈的对象容器,允许高效地存储和访问可以从一组类型中选择的一种类型对象,这些类型必须在编译时指定。
- 正确性和 测试
- 数据结构
- dynamic_bitset - 动态
std::bitset-
像数据结构
- dynamic_bitset - 动态
- 函数对象和 高阶编程
- bind 和 mem_fn - 用于函数、函数对象、函数指针和成员函数的通用绑定器
- function - 用于延迟调用的函数对象包装器。此外,还提供了一种通用的回调机制
- functional - 对 C++ 标准库中指定的函数对象适配器的增强,包括
- hash - C++ 技术报告 1 (TR1) 中指定的散列函数对象的实现。可以用作无序关联容器的默认散列函数
- lambda - 本着 lambda 抽象 的精神,允许在调用站点定义小的匿名函数对象并对这些对象进行操作,使用占位符,尤其是在使用来自算法的延迟回调时。
- ref - 提供用于增强标准 C++ 引用功能的实用程序类模板,尤其是在使用泛型函数时
- result_of - 帮助确定调用表达式的类型
- Signals2 - 托管的信号和槽回调实现
- 泛型编程
- 图形
- 输入/输出
- 跨语言支持(针对 Python)
- 迭代器
- 数学和数值
- 内存
- 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 - 帮助确定调用表达式的类型
- 其他
- 解析器
- 预处理器元编程
- 字符串 和文本处理
- 模板元编程
- 针对损坏编译器的解决方法
当前的 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 的概率分布,它们组合在一起构建一个具体的生成器。
- 示例显示如何使用 Mersenne Twister 生成器从 正态分布 中采样。
#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;
}
- Boost.Threads 简介 在 Dr. Dobb's 杂志 中。(2002 年)
- Boost Threads 中的新增功能? 在 Dr. Dobb's 杂志 中。(2008 年)
- Boost.Threads API 参考。
- threadpool 库 基于 Boost.Thread。
- Ceemple Boost 包含在 Ceemple 中,Ceemple 是一种基于 JIT 的快速 C++ 技术计算环境。