C++ でユーザー定義キーを使用したいと考えていますstd::map
。キーは、最大値を持つ整数セットのバイナリ表現である2^V
ため、すべての2^V
可能な値を表すことはできません。これは、効率的なバイナリ セット表現、つまり の配列を使用して行いuint64_t
ます。
ここでの問題は、このユーザー定義のビットセットを のキーとして配置するにはstd::map
、ビットセット値間の有効な比較を定義する必要がありますが、たとえば の最大サイズがある場合、V=1000
比較できる数値を取得できないことです。それらをすべて集約するだけで2^1000
は表現できません。
したがって、私の質問は、(ビットセット表現で正しいビットを設定することによって) 2 つの異なるセットがあり、オーバーフローするため最終的な数値を表すことができないとします。
id_1 = 2^0 + 2^1 + ... + 2^V
id_2 = 2^0 + 2^1 + ... + 2^V
比較できる値につながる適切な変換はありますか? id_1 < id_2
指数関数の合計を表現可能な値に変換したいが、「未満」の不変式を維持したいと言える必要があります。たとえば、対数変換を巧妙な方法で適用して「未満」を維持するなどの方針に沿って考えていました。
次に例を示します。
set_1 = {2,3,4}; set_2 = {8}
id(set_1) = 2^2 + 2^3 + 2^4 = 28; id(set_2) = 2^8 = 256
id(set_1) < id(set_2)
完全!を持つことができる一般的なセット{1,...,V}
、したがって2^V
可能なサブセットはどうですか?