次のようなバイナリ データがある場合:
string buffer = "0101001111011";
次のように初期化します (このケースを処理するコンストラクターがあることがわかります)。
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap)
{
bitMap = boost::dynamic_bitset<unsigned char> (buffer);
}
生データが必要な場合は、イテレータ コンストラクタを使用します。
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap)
{
bitMap = boost::dynamic_bitset<unsigned char> (buffer.begin(), buffer.end());
}
これらは必要なメモリを2回割り当てることになるため、スタック割り当てとスワップを使用したほうがよい場合があります。または、C++0x まで待って、移動セマンティクスに任せることもできます。
// Unecessary in C++0x
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap)
{
boost::dynamic_bitset<unsigned char> localBitmap(buffer.begin(), buffer.end());
bitMap.swap(localBitmap);
}
編集:最初のバージョンが2倍のメモリを割り当てる理由を明確にするために:
最初のバージョンを書く別の方法を見てみましょう:
typedef boost::dynamic_bitset<unsigned char> bits; // just to shorten the examples.
void populateBitSet (std::string &buffer, bits &bitMap)
{
const bits &temp = bits(buffer); // 1. initialize temporary
bitMap = temp; // 2. Copy over data from temp to bitMap
}
最初の例のように、これら 2 つの行を一緒にすると、スタック上に一時的に構築され、その後に代入が続きます。1.ブーストでは、ビットのセット全体に十分なメモリを割り当てる必要があります。2 では、boost は、同じビット セットを保持するのに十分なメモリを再度割り当ててから、値をコピーする必要があります。bitMap には既に十分なメモリがある可能性があるため、常に再割り当てする必要はありませんが、バッキング メモリを解放して最初から再割り当てする可能性もあります。
stl 型に適合するほとんどのコンテナーには、スワップの片側を破棄する場合に代入の代わりに使用できるスワップ機能もあります。これらは通常 O(1) であり、いくつかのポインターを交換するだけであることが多いため、非スローです。これらが役立つ別の理由については、 このGotWを参照してください。
C++0X では、代入を使用でき、スワップの利点も得られます。一時値のように r 値をオーバーロードできるため、コンテナーは、一時値を割り当てると、一時値を共食いし、基本的にスワップを実行できることを認識します。Visual Studio チーム ブログでは、右辺値とムーブ セマンティクスについて詳しく説明しています。