このアーティクル(とサンプルコード)は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例外です。オーバーフローを起こさない、より安全なバッファとして使えますね。
#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!\n" << endl; } for ( int item : sv ) { cout << item << endl; } }