私の目標は、ストリングインターニングを行うことです。このために、次のことができるハッシュ化されたコンテナー クラスを探しています。
- ノードごとに 1 つのメモリ ブロックのみを割り当てる
- ノードごとに異なるユーザーデータ サイズ
値の型は次のようになります。
struct String
{
size_t refcnt;
size_t len;
char data[];
};
すべての String オブジェクトのサイズは異なります。これは、演算子 new + 配置 new で実現されます。したがって、基本的にはノードを自分で割り当てて、後でコンテナーにプッシュしたいと考えています。
以下の容器は適していません:
- std::unordored_set
ブースト::マルチインデックス::*
異なるサイズのノードを割り当てることはできません
boost::intrusive::unordered_set
最初はうまくいくようです。しかし、いくつかの欠点があります。まず、バケット配列を割り当て、負荷係数を自分で維持する必要があります。これは単に不必要であり、エラーが発生しやすいものです。
しかし、もう 1 つの問題は解決が困難です。文字列型のオブジェクトしか検索できません。しかし、エントリを探すたびに文字列を割り当てるのは非効率的で、入力として std::string しかありません。
このタスクに使用できるハッシュ化されたコンテナーは他にありますか?