Boost

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Boost C++ Libraries
Boost ロゴ
最新版 1.56.0 / 2014年8月7日(2か月前) (2014-08-07
種別 Libraries
ライセンス Boost Software License
公式サイト http://www.boost.org
テンプレートを表示

Boostブースト)とは、C++の先駆的な開発者のコミュニティ、及びそのコミュニティによって公開されているオープンソースライブラリのことを指す。コミュニティとしてのBoostはC++標準化委員会の委員により設立されており、現在でもその多くが構成員として留まっている。このような経緯もあってBoostコミュニティはC++の標準化に対してかなりの影響力を有している。実際に標準化委員会の発表した「TR1」の2/3以上がBoostライブラリを基にしている。このことからBoostはC++の標準化にあたり有効なアイデアをテストする場であるとも言える。

Boostで公開されるライブラリはコミュニティの公開レビューによって精選されている。使用にあたっては商用、非商用を問わず無償のBoost Software Licenseの下でライセンスされる。

Boostはテンプレートなどを活用して積極的にメタプログラミングジェネリックプログラミングを取り入れていこうという傾向がある。そのためBoostライブラリの利用者はしばしばC++の現代的なアプローチに精通していることを求められる。

内容[編集]

Boostは次のような分野のライブラリが含まれている。

  • アルゴリズム
  • 並列プログラミング
  • コンテナ
    • array - STLコンテナ方式による固定長配列の管理
    • Boost Graph Library (BGL) - 総称的グラフコンテナ、コンポーネント、アルゴリズム
    • multi-array - N次元配列の生成の単純化
    • multi-index containers - 異なるソートとアクセスセマンティクスを可能にするビルトインインデックスのあるコンテナ
    • pointer containers - 値へのポインタを素直に管理できるようにする標準的なSTLコンテナをモデルにしたコンテナ
    • property map - コンセプト的なインターフェイス仕様とキー値をオブジェクトにマップするための多目的インターフェイス
    • variant - コンパイル時に指定する型の集合から選べる型オブジェクトの効率的なストレージと、それにアクセスする型安全で総称的なスタックベースのオブジェクトコンテナ
  • 正当性とテスト
    • concept check - 指定可能なテンプレートパラメータ(コンセプト)を制限できるようにする
    • static assert - コンパイル時アサートのサポート
    • Boost Test Library - テストプログラムの作成、テストケースとテストスイートによるテストの構成、そしてそれらの実行制御のためのコンポーネントの組み合わせ。
  • データ構造
  • 関数オブジェクト高階プログラミング (無名関数など)
    • bind and mem_fn - 関数、関数オブジェクト、関数ポインタおよびメンバ関数のための汎用バインダ
    • function - 遅延呼び出しのための関数オブジェクトのラッパ。コールバックのための汎用的なメカニズムも提供される。
    • functional - C++標準ライブラリで定義される関数オブジェクトのアダプタの強化。以下の内容を含む。
    • hash - C++ C++ Technical Report 1 (TR1) で定義されているハッシュ関数オブジェクトの実装。ソートされていない連想コンテナのデフォルトのハッシュ関数として利用できる。
    • lambda - ラムダ抽象化の考え方で、小さい無名関数オブジェクトを定義できるようにして、プレースフォルダを使用して、特にアルゴリズムからの遅延呼び出しを使って、呼び出し地点でのこれらのオブジェクトの操作を可能とする。
    • ref - 標準C++の参照の能力を強化するため、特にテンプレート関数で利用するための、ユーティリティクラステンプレートを提供する。
    • result_of - 関数オブジェクトの戻り値の型を取り出す。関数の型を定義するのに役立つ。
    • signals2 - 管理されたシグナルとスロットのコールバック実装
  • 総称プログラミング
  • Graphs
  • 入出力
  • 言語間サポート(Python用)
  • イテレータ
    • iterators
    • 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 - 以下のようなその他のクラス。
      • base from member idiom - 派生クラスのコンストラクタの初期化子でベースクラスのメンバを初期化する必要のあるクラスのための回避策を提供する。
      • checked delete - 不完全な型へのポインタを使用してオブジェクトまたはオブジェクトの配列を破棄しようとする試みをチェックする。
      • next and prior functions - 特に操作の結果が異なるイテレーターに保存されている必要がある(つまりオリジナルのイテレーターを変更できない)場合に、前方向または両方向のイテレーターをより簡単に操作できる。
      • noncopyable - コピーコンストラクタと代入演算子を禁止できる。
      • addressof - operator&()演算子のオーバーロードをバイパスしてオブジェクトの実際のアドレスを取得できるようにする。
      • result_of - 関数の型を定義するのに役立つ。
  • その他
  • 構文解析
  • プリプロセッサメタプログラミング
  • 文字列とテキスト処理(正規表現など)
    • lexical_cast - テキストとの型変換
    • format - タイプセーフな引数のフォーマット文字列
    • iostreams - 新しい送受信フィルタフレームワークのためのC++ストリームとストリームバッファの補助
    • regex, xpressive - 正規表現のサポート
    • Spirit - オブジェクト指向的な再帰的下向き構文解析ジェネレーターのフレームワーク。
    • string algorithms - 文字列に関する様々なアルゴリズムのコレクション。
    • tokenizer - 文字列やその他の文字シーケンスをトークンで分割できるようにする。
    • wave - C99/C++のプリプロセッサ機能の標準に準拠した実装。使いやすいインターフェイスでラップされている。
  • テンプレートメタプログラミング
    • mpl - コンパイル時のアルゴリズム、シーケンス、メタ関数の、多目的で高レベルのメタプログラミングフレームワーク。
    • static assert - コンパイル時アサートのサポート
    • type traits - 基礎的な型の属性を定義するテンプレート。
  • 不完全なコンパイラの回避手段

線型代数[編集]

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

  • 以下はベクトルと行列の乗算方法を表している。
#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<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はディストリビューション非依存の擬似乱数と、具体的な生成器を構築するために組み合わせる疑似乱数(PRNG)に依存しない確率分布を提供する。

#include <boost/random.hpp>
#include <ctime>
 
using namespace boost;
 
double SampleNormal (double mean, double sigma)
{
  // 1970年からの秒でシードを一度初期化した
  // メルセンヌ・ツイスタ乱数生成器の作成
  static mt19937 rng(static_cast<unsigned> (std::time(0)));
 
  //  ガウス確率分布を選択
  normal_distribution<double> norm_dist(mean, sigma);
 
  // 関数の形で乱数生成器を分布にバインドする。
  variate_generator<mt19937&, normal_distribution<double> > normal_sampler(rng, norm_dist);
 
  // 分布からサンプルする。
  return normal_sampler();
}

詳細はBoost Random Number Libraryを参照。

テキストのパース[編集]

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

  • カンマ区切りの数値を読み込むパーサ :
#include <boost/spirit/core.hpp>
#include <boost/spirit/actor/push_back_actor.hpp>
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
using namespace boost::spirit;
 
//  Parser comma-separated numbers
bool parse_numbers(const char* str, vector<double>& v)
{
   return parse(str,
       //  Start grammar
       (
           real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)])
       )
       ,
       //  End grammar
       space_p).full;
}

詳細は Spirit User's Guide を参照。

正規表現の利用[編集]

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

  • テキストをパースするプログラムの例。
#include <boost/regex.hpp>
#include <vector>
#include <string>
 
// Example program parsing the URL
int main(int argc, char** argv)
{
// Check the number of parameters
    if (argc < 2) return 0;
 
// container for the values
std::vector<std::string> values;
// Expression to parse
boost::regex expression(
//       proto                 host               port
        "^(\?:([^:/\?#]+)://)\?(\\w+[^/\?#:]*)(\?::(\\d+))\?"
//       path                  file       parameters
        "(/\?(\?:[^\?#/]*/)*)\?([^\?#]*)\?(\\\?(.*))\?"
                       );
// The formation of the source string to parse (taken from command-line)
std::string src(argv[1]);
 
    // Parse and filling the container
    if (boost::regex_split(std::back_inserter(values), src, expression))
    {
        // Output the result
        const char* names[] = {"Protocol", "Host", "Port", "Path", "File", "Parameters", NULL};
        for (int i = 0; names[i]; i++)
            printf("%s: %s\n", names[i], values[i].c_str());
    }
    return 0;
}

詳細は Boost.Regex を参照。

グラフ (データ構造)のアルゴリズム[編集]

Boost Graph provides a flexible and effective implementation of the concept of graphs in the form of multiple views of a graph and a large number of algorithms.

#include <iostream>
#include <list>
#include <algorithm>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/topological_sort.hpp>
#include <iterator>
#include <utility>
 
int main(int , char* [])
{
  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<Graph>::vertex_descriptor Vertex;
 // Container for the chain of vertices
 typedef std::vector<Vertex> container;
 // Type of representation of arcs
 typedef std::pair<std::size_t,std::size_t> Pair;
 
 // Edges of the graph 
 Pair edges[6] = { Pair(0,1), Pair(2,4),
                   Pair(2,5),
                   Pair(0,3), Pair(1,4),
                   Pair(4,3) };
 // Count
 Graph G(edges, edges + 6, 6);
 // Dictionary to get a handle on the numbers of vertices vertices
 boost::property_map<Graph, vertex_index_t>::type id = get(vertex_index, G);
 // Container for storing the sorted vertices
 container c;
 
 // Execute algorithm
 topological_sort(G, std::back_inserter(c));
 
 // Output results: sorting descriptors of the graph in the container,
 // Get the serial number of vertices
 std::cout << "Topological check:";
 for (container::reverse_iterator ii = c.rbegin(); ii != c.rend(); ++ii)
   std::cout << id[*ii] << " ";
 std::cout << std::endl;
 
 return 0;
}

詳細は the Boost Graph Library を参照。

マルチスレッド[編集]

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

#include <boost/thread/thread.hpp>
#include <iostream>
using namespace std; 
 
void hello_world() 
{
  cout << "Hello world, I'm a thread!" << endl;
}
 
int main() 
{
  // hello_world関数を呼び出す新しいスレッドを起動する。
  boost::thread my_thread(&hello_world);
  // スレッドが終了するまで待つ。
  my_thread.join();
 
  return 0;
}

外部リンク[編集]