Boost C++ライブラリ

Boost とは、C++の先駆的な開発者のコミュニティ、およびそのコミュニティによって公開されているオープンソースのソフトウェアライブラリのことを指す。コミュニティとしてのBoostはC++標準化委員会の委員により設立されており、現在でもその多くが構成員として留まっている。このような経緯もあり、BoostコミュニティはC++の標準化において大きな影響力を有している。実際に標準化委員会が発表した「TR1」の2/3以上がBoostライブラリを基にしている。Random, Regex, ThreadなどはいずれもC++11規格の標準ライブラリとして正式に導入・標準化されている。このことから、Boostは考案された新機能を標準化させる前の試験運用の場であるとも言える。

Boostで公開されるライブラリはコミュニティの公開レビューによって精選されている。Boostを使用して作成したプログラムは、商用、非商用を問わず無償の[1]の下でライセンスされる。

Boostはテンプレートなどを活用して積極的にメタプログラミングやジェネリックプログラミングの技法を取り入れて行く傾向がある。そのためBoostライブラリの利用者にはC++の現代的な記述に慣れていることを要求される。

このライブラリは、先鋭的な技術を好むプログラマーが積極的に使用していることで有名である。

1. 内容
-----

Boostには次のような分野のライブラリが含まれている。ライブラリの一部はビルドが必要。

アルゴリズム
並列プログラミング
[2] - スレッド
[3] - ユーザーレベルコンテキストスイッチ
[4] - コルーチン
[5] - ファイバー
[6] - OpenCLベースのマルチコアCPU/GPGPU演算プラットフォームインターフェイス
コンテナ
[7] - STLコンテナ方式による固定長配列の管理
[8] - 総称的グラフコンテナ、コンポーネント、アルゴリズム
[9] - N次元配列の生成の単純化
[10] - 異なるソートとアクセスセマンティクスdate=2023年6月}}を可能にするビルトインインデックスのあるコンテナ
[11] - 値へのポインタを素直に管理できるようにする標準的なSTLコンテナをモデルにしたコンテナ
[12] - コンセプト的なインターフェイス仕様とキー値をオブジェクトにマップするための多目的インターフェイス
[13] - コンパイル時に指定する型の集合から選べる型オブジェクトの効率的なストレージと、それにアクセスする型安全で総称的なスタックベースのオブジェクトコンテナ
正当性とテスト
[14] - 指定可能なテンプレートパラメータを制限できるようにする
[15] - コンパイル時アサートのサポート
[16] - テストプログラムの作成、テストケースとテストスイートによるテストの構成、そしてそれらの実行制御のためのコンポーネントの組み合わせ。
データ構造
[17] - 動的なstd::bitset-に似たデータ構造
関数オブジェクトと高階プログラミング
[18]と[19] - 関数、関数オブジェクト、関数ポインタおよびメンバ関数のための汎用バインダ
[20] - 遅延呼び出しのための関数オブジェクトのラッパー。コールバックのための汎用的なメカニズムも提供される。
[21] - C++標準ライブラリで定義される関数オブジェクトのアダプタの強化。以下の内容を含む。
[22]
[23]
[24]
[25]
[26]
[27] - C++ Technical Report 1  で定義されているハッシュ関数オブジェクトの実装。ソートされていない連想コンテナのデフォルトのハッシュ関数として利用できる。
[28] - ラムダ抽象化の考え方で、プレースホルダー  を使用して、小さい無名関数オブジェクトを定義できるようにする。特にアルゴリズムからの遅延呼び出しを使って、呼び出し地点でのこれらのオブジェクトの操作を可能とする。
[29] - 標準C++の参照の能力を強化するため、特に関数テンプレートで利用するための、ユーティリティクラステンプレートを提供する。
[30] - 関数オブジェクトの戻り値の型を取り出す。関数の型を定義するのに役立つ。
[31] - 管理されたシグナルとスロットのコールバック実装
総称プログラミング
Graphs
入出力
言語間サポート
イテレータ
[32]
[33] - ユーザー定義のイテレーターのための演算子をオーバーロードしてクラスが算術計算に適用できるようにするクラステンプレート。
[34] - シーケンス内に含まれるトークンのセットをコンテナとして見えるようにしてイテレーターでアクセスできるようにする。
数学と計算
[35] - 3次元コンピュータグラフィックスプログラミングで多用される固定サイズのクォータニオン、ベクトルdate=2021年7月}}、行列
メモリ
[36] - 分割されたストレージベースのシンプルなメモリ管理スキームを提供する。
[37] - 様々なポインタ管理方式によるスマートポインタクラステンプレートのコレクション。
[38] - ポインタを所有する。
[39] - 配列用のscoped_ptr。
[40] - 他のshared_ptrと共有できるポインタ。最後のshared_ptrが破棄されたときにポインタを破棄する。
[41] - 配列用のshared_ptr。
[42] - すでにshared_ptrで管理されているオブジェクトへの「弱い」参照を提供する。
[43] - ポインタが提供する参照カウンタを使用するshared_ptrに似たクラス。
[44] - 以下のようなその他のクラス。
[45] - 派生クラスのコンストラクタの初期化子でベースクラスのメンバを初期化する必要のあるクラスのための回避策を提供する。
[46] - 不完全な型へのポインタを使用してオブジェクトまたはオブジェクトの配列を破棄しようとする試みをチェックする。
[47] - 特に操作の結果が異なるイテレーターに保存されている必要がある場合に、前方向または両方向のイテレーターをより簡単に操作できる。
[48] - コピーコンストラクタと代入演算子を禁止できる。
[49] - operator&演算子のオーバーロードをバイパスしてオブジェクトの実際のアドレスを取得できるようにする。
[50] - 関数の型を定義するのに役立つ。
その他
構文解析
プリプロセッサメタプログラミング
文字列とテキスト処理
[51] - テキストとの型変換
[52] - タイプセーフな引数のフォーマット文字列
[53] - 新しい送受信フィルタフレームワークのためのC++ストリームとストリームバッファの補助
[54], [55] - 正規表現のサポート
Spirit - オブジェクト指向的な再帰的下向き構文解析ジェネレーターのフレームワーク。
[56] - 文字列に関する様々なアルゴリズムのコレクション。
[57] - 文字列やその他の文字シーケンスをトークンで分割できるようにする。
[58] - C99/C++のプリプロセッサ機能の標準に準拠した実装。使いやすいインターフェイスでラップされている。
テンプレートメタプログラミング
[59] - コンパイル時のアルゴリズム、シーケンス、メタ関数の、多目的で高レベルのメタプログラミングフレームワーク。
[60] - コンパイル時アサートのサポート
[61] - 基礎的な型の属性を定義するテンプレート。
不完全なコンパイラの回避手段

2. 線型代数
-------

Boostには、BLASのレベル1、2、3の各演算を実装したuBLASという線型代数  ライブラリがある。

以下はベクトルと行列の乗算方法を表している。

include <boost/numeric/ublas/vector.hpp>
include <boost/numeric/ublas/matrix.hpp>
include <boost/numeric/ublas/io.hpp>using namespace boost::numeric::ublas;

/* "y = Ax" example */ int main { vector x; x = 1; x = 2;

matrix A; A = 0; A = 1; A = 2; A = 3;

vector y = prod;

std::cout << y << std::endl; return 0; }<WtXmlEndTag />

3. 乱数生成
-------

Boost.Random - 分布非依存の擬似乱数生成器  と、具体的な生成器を構築するために組み合わせる疑似乱数に依存しない確率分布を提供する。

以下はメルセンヌ・ツイスタ生成器を利用した正規分布によりサンプルする方法を表している。

include <boost/random.hpp>
include <boost/random/random_device.hpp>double SampleNormal { // 非決定論的な乱数生成器をシードに使用。 boost::random::random_device seed_gen; // メルセンヌ・ツイスタ乱数生成器の作成。 typedef boost::random::mt19937 MyGenerator; MyGenerator rand_gen;

// ガウス確率分布を選択。 typedef boost::random::normal_distribution MyDistribution; MyDistribution dist;

// 関数の形で乱数生成器を分布にバインドする。 boost::random::variate_generator<MyGenerator&, MyDistribution> sampler;

// 分布からサンプルする。 return sampler; }<WtXmlEndTag /> 詳細は[62]を参照。

Boost.RandomのサブセットがC++11の標準ライブラリとして取り込まれた。

4. テキストのパース
-----------

Boost.Spirit - バッカス・ナウア記法に出来るだけ近いC++のプログラム形式で直接パーサを記述するという、Boostにおける最も複雑なライブラリのひとつ。

カンマ区切りの数値を読み込むパーサの例。

include <boost/spirit/core.hpp>
include <boost/spirit/actor/push_back_actor.hpp>
include
include
include using namespace std; using namespace boost::spirit;

// Parser comma-separated numbers bool parse_numbers { return parse] >> *]) ) , // End grammar space_p).full; }<WtXmlEndTag /> 詳細は [63] を参照。

5. 正規表現の利用
----------

Boost.Regex - 正規表現を利用するライブラリ。フィルタ・検索・パース・テキスト処理に必要な各種関数を持っている。

正規表現の種類としてPCRE、POSIX基本正規表現とPOSIX拡張正規表現が利用可能である。

テキストをパースするプログラムの例。

include <boost/regex.hpp>
include
include // Example program parsing the URL int main { // Check the number of parameters if  return 0;

// container for the values std::vector values; // Expression to parse boost::regex expression://)\?)\?" // path file parameters "*)\?\?)\?" ); // The formation of the source string to parse  std::string src;

// Parse and filling the container if , src, expression)) { // Output the result const char* names[] = {"Protocol", "Host", "Port", "Path", "File", "Parameters", NULL}; for  printf); } return 0; }<WtXmlEndTag /> 詳細は [64] を参照。

Boost.RegexのサブセットがC++11の標準ライブラリとして取り込まれた。

5.1. 動的な正規表現と静的な正規表現
--------------------

Boost.Xpressiveは、動的な正規表現と静的な正規表現を提供する。 以下のプログラムは「私は2052/10/30に生まれた。」という文字列に対し、年月日を抽出する正規表現である。どちらも出力結果は同じである。

5.1.1. 動的な正規表現
--------------

include
include
include <boost/xpressive/xpressive.hpp>using namespace boost::xpressive;

int main { // 従来の char[] 型の文字列リテラルの内部表現は処理系依存であり、Shift_JIS の 0x5c など、場合によっては問題を引き起こす可能性があるため、UTF-8 文字列リテラルを使用するべき。 // しかし C++20 以降は UTF-8 文字列リテラルの型が char8_t[] 型になるため、明示的なキャストが必要。 // また、Microsoft Visual C++ 環境ではデフォルトで UTF-8 文字列をコンソールに出力できない。 std::string str = "私は2052/10/30に生まれた。";

sregex rx = sregex::compile//)"); smatch m;

if ) { // ここでは range-based for 構文を使っているので、C++11 以降に対応したコンパイラが必要。 for  { std::cout << e << std::endl; } } }<WtXmlEndTag />

5.1.2. 静的な正規表現
--------------

include
include
include <boost/xpressive/xpressive.hpp>using namespace boost::xpressive;

int main { std::string str = "私は2052/10/30に生まれた。";

mark_tag years, month, days;

sregex rx = ) >> '/' >> ) >> '/' >> );

smatch m; if ) { std::cout << m[0] << std::endl; std::cout << m[years] << std::endl; std::cout << m[month] << std::endl; std::cout << m[days] << std::endl; } }<WtXmlEndTag />

6. グラフのアルゴリズム
-------------

Boost.Graph - グラフ理論の複数の視点および多数のアルゴリズムの形で、グラフ概念の柔軟かつ効果的な実装を提供する。

アルゴリズムの例：トポロジカルソート

include
include
include
include <boost/graph/adjacency_list.hpp>
include <boost/graph/topological_sort.hpp>
include
include int main { using namespace boost;

// Type of graph typedef adjacency_list<vecS, vecS, directedS, property<vertex_color_t, default_color_type> > Graph; // Handle vertices typedef boost::graph_traits::vertex_descriptor Vertex; // Container for the chain of vertices typedef std::vector container; // Type of representation of arcs typedef std::pair<std::size_t,std::size_t> Pair;

// Edges of the graph Pair edges[6] = { Pair, Pair, Pair, Pair, Pair, Pair }; // Count Graph G; // Dictionary to get a handle on the numbers of vertices vertices boost::property_map<Graph, vertex_index_t>::type id = get; // Container for storing the sorted vertices container c;

// Execute algorithm topological_sort);

// Output results: sorting descriptors of the graph in the container, // Get the serial number of vertices std::cout << "Topological check:"; for ; ii != c.rend; ++ii) std::cout << id[*ii] << " "; std::cout << std::endl;

return 0; }<WtXmlEndTag /> 詳細は [65] を参照。

7. マルチスレッド
----------

Boost.Thread - プラットフォームに依存しないスレッドの抽象化を提供する。APIはPOSIXスレッドをベースにオブジェクト指向化したものとなっている。

スレッドを生成しているコードの例。

include <boost/thread/thread.hpp>
include void hello_world { std::cout << "Hello world, I'm a thread!" << std::endl; }

int main { // hello_world関数を呼び出す新しいスレッドを起動する。 boost::thread my_thread; // スレッドが終了するまで待つ。 my_thread.join;

return 0; }<WtXmlEndTag />

Boost.ThreadのサブセットがC++11の標準ライブラリとして取り込まれた。

[66] in Dr. Dobb's Journal.
Boost.Threads [67].
[68] based on Boost.Thread

8. 脚注
-----

9. 外部リンク
--------

[69]
[70]
[71] 
[72]