C++ 程式設計/庫/Boost
該 Boost 專案 (http://www.boost.org/) 提供免費的 同行評審、開源 庫,這些庫擴充套件了 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++ 技術計算環境。