2

setdynamic_bitsetオブジェクトを使用しようとしていますが、実行時にアサーションエラーが発生します。

a.out: boost/dynamic_bitset/dynamic_bitset.hpp:1291: 
 bool boost::operator<(const boost::dynamic_bitset<Block, Allocator>&, 
                       const boost::dynamic_bitset<Block, Allocator>&) 
 [with Block = long unsigned int, 
       Allocator = std::allocator<long unsigned int>]: 
 Assertion `a.size() == b.size()' failed.

コードは次のとおりです。

#include <iostream>
#include <set>
#include <boost/dynamic_bitset.hpp>

int main() {
  typedef boost::dynamic_bitset<> bitset;
  std::set<bitset> myset;
  bitset x(2, 0);
  bitset y(3, 1);
  myset.insert(x);
  myset.insert(y);
  return 0;
}

dynamic_bitset挿入されたオブジェクトに同じサイズが必要なのはなぜだろうか。が機能するためoperator<には、短いビットセットの最上位ビットが暗黙的にゼロで埋められていると想定できませんでしたか?

そのセットを機能させる方法はありますdynamic_bitsetか?

unordered_setを必要としないので試してみましたoperator<が、がないのでコンパイルできませdynamic_bitsetん。また、短いビットセットでのみ機能するメンバー関数hash_valueを使用せずにそれを記述する方法がわかりません。to_ulong

4

1 に答える 1

5

アサーションの理由は、のoperator<実装方法です。

for (size_type ii = a.num_blocks(); ii > 0; --ii)

ビットセットを反復処理するために、最初のオペランドのブロックカウントのみが使用されます。最初のビットセットのサイズが大きい場合、範囲外の2番目のビットセットにアクセスします。

std :: setを使用して独自のcomperatorを定義および使用し、適切と思われるさまざまなサイズのビットセットの比較を処理できます。

struct my_less {
    bool operator()(const boost::dynamic_bitset<>& lhs, 
                    const boost::dynamic_bitset<>& rhs) const
    {
        //TODO: implement custom comparison for lhs < rhs
        return false;
    }
};
typedef boost::dynamic_bitset<> bitset;
std::set<bitset,my_less> myset;

myset.insert( bitset(2, 0) );
myset.insert( bitset(3, 1) );
于 2012-12-28T23:46:41.147 に答える