Boost.Containerのフツーじゃないコンテナたち

CodeZine / 2014年12月5日 14時0分

 標準C++ライブラリが提供するコンテナは可変長配列、双方向リスト、二進木、ハッシュ表など。これだけの品揃えならあらかたのシチュエーションでそれぞれに適したコンテナを選択できることでしょう。加えてそれだけでは満足できない御仁のための有用なコンポーネントの集合体:Boostには、標準ライブラリには含まれていない便利なコンテナが収められています。

記事中のサンプルコードについて
 このアーティクル(とサンプルコード)は2014年11月時点での最新版:Boost 1.57.0を用いています。Boostサイトから入手したアーカイブを適当なディレクトリに展開し、そのパスを環境変数:BOOSTROOTに設定してください。そのディレクトリ<BOOSTROOT>上でコマンドラインから、

bootstrap b2 -j8
でライブラリがビルドされ、<BOOSTROOT>/lib/stageに生成されます。b2 -j8 の'8'はビルド時に使用するスレッド数で、大きいほど短時間でビルドが完了します。論理コア数で頭打ちになりますけどね(b2だけだとシングルスレッドでビルドされます)。



■boost::container::static_vector

 static_vectorはstd::arrayとstd::vectorのあいのこ。std::array<T,N>は固定長配列 T[N]を標準コンテナ化したもので、要素数:size()は常にNを返しますし、要素の挿入/削除ができません。対してstatic_vector<T,N>は要素数N個"以下"の可変長配列としてふるまいます。最大N個の要素を格納する領域は動的に取得/解放されることはなく、(std::array<T,N>と同様)インスタンス内部に"静的"に確保されます(static_vectorの名はそのことに由来します)。

 static_vector<T,N>にN個を超える要素を挿入しようとするとstd::bad_alloc例外がthrowされます。また、最大要素数の異なるstatic_vector<T,M>とstatic_vector<T,N>との間でのコピーもできますが、コピー先(左辺)のcapacity()がコピー元(右辺)のsize()より小さいと、同様にstd::bad_alloc例外です。オーバーフローを起こさない、より安全なバッファとして使えますね。

list01 static_vector.cpp
#include <iostream> #include <boost/container/static_vector.hpp> using namespace std; int main() { const int N = 10; cout << "static_vector<short," << N << ">\t: " << sizeof(boost::container::static_vector<short,N>) << endl; cout << "static_vector<int," << N << ">\t: " << sizeof(boost::container::static_vector<int,N>) << endl; cout << "static_vector<int," << N*2 << ">\t: " << sizeof(boost::container::static_vector<int,N*2>) << endl; cout << endl; boost::container::static_vector<int,N> sv { -3, -2, -1 }; try { for ( int i = 0; i < N; ++i ) { sv.emplace_back(i); } } catch ( std::exception& ex) { cout << ex.what() << endl; cout << "CAN'T INSERT ITEMS ANY MORE! " << endl; } for ( int item : sv ) { cout << item << endl; } }




CodeZine

トピックスRSS

ランキング