このアーティクル(とサンプルコード)は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;
}
}

