跳轉到內容

C++ 程式設計/庫/Boost

來自 Wikibooks,開放世界中的開放書籍

Boost 專案 (http://www.boost.org/) 提供免費的 同行評審開源 ,這些庫擴充套件了 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;
}
華夏公益教科書