質問

ダイナミックビットセットする

私は私が移入する必要があるユースケースを持っている。

boost::dynamic_bitset<unsigned char> , from a std::string buffer.

あなたはこのについて移動する方法としてお勧めできます。だから私は機能を考え出す必要があります。

void populateBitSet (std::string &buffer, 
            boost::dynamic_bitset<unsigned char> & bitMap) {

     //populate bitMap from a string buffer
}
役に立ちましたか?

解決

あなたはこのようなバイナリデータを持っている場合:

string buffer = "0101001111011";

あなたは(このようにそれを初期化したい判明<のhref =「http://www.boost.org/doc/libs/1_38_0/libs/dynamic_bitset/dynamic_bitset.html#cons3」のrel = "noreferrerがあります「>このような場合を扱うコンストラクタの):

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());
}

これらは二回、必要なメモリを割り当ててしまうんので、あなたはスタック割り当てとスワップとしたほうが良いかもしれません。それとも、ただ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);
}

編集: 最初のバージョンは多くのメモリの倍割り当てる理由を明確にする:

最初のバージョンを書くために別の方法を見てみます:

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において、ブーストはビットの同じセットを保持した後の値をコピーするために、再度十分なメモリを割り当てる必要があります。それは常に再割り当てする必要はないかもしれないので、ビットマップはすでに、十分なメモリを持っている可能性がありますが、それはそれはその裏メモリを解放し、とにかくゼロから再割り当てすることも可能です。

STLの金型に合うほとんどのコンテナはまた、あなたが離れてスワップの片側をスローするようにしようとするとき、あなたが代入の代わりに使用することができますスワップ機能を持っています。彼らは多くの場合、単にいくつかのポインタを交換伴うように、これらは通常、O(1)と非投げています。これらが有用である理由別の理由で、この GotW のを参照してください。

C ++ 0Xでは、割り当てを使用し、まだスワップの利点を得ることができるようになります。あなたは(一時的のような)r値にオーバーロードすることができますので、コンテナを使用すると、一時的に割り当てるときに、それは一時の共食いと基本的にスワップを行うことができることを知っていることを知っています。 Visual Studioチームのブログには、右辺値をカバーし、意味論<のhref = "http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-を移動しましたパート2.aspx」のrel = "noreferrer">非常によくここを。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top