String-Interning使用哪个容器

时间:2012-12-04 10:45:48

标签: c++ hashtable boost-multi-index string-interning intrusive-containers

我的目标是进行字符串实习。为此,我正在寻找一个哈希 容器类可以执行以下操作:

  • 每个节点仅分配一个内存块
  • 每个节点不同的用户数据大小

值类型如下所示:

struct String
{
    size_t refcnt;
    size_t len;
    char data[];
};

每个String对象都有不同的大小。这将完成 opereator new + placement new。 所以基本上我想自己分配Node并稍后将其推入容器中。

以下容器不适合:

  • 的std :: unordored_set
  • 升压:: multi_index :: *

    无法分配不同大小的节点

  • 升压::侵入:: unordered_set

    最初似乎工作。但有一些缺点。首先,你必须分配 桶阵列并自己维护负载因子。这是不必要的 并且容易出错。

    但另一个问题难以解决:你只能搜索拥有该问题的对象 类型字符串。但是每次查找条目时分配String都是低效的 并且你只有一个std :: string作为输入。

是否有其他可用于此任务的散列容器?

2 个答案:

答案 0 :(得分:0)

我认为你不能用任何标准容器做到这一点。

您可以做的是将指针存储到String并提供自定义哈希和cmp仿函数

struct StringHash
{
   size_t operator() (String* str)
  {
    // calc hash
  } 
};

struct StringCmp
{
   bool operator() (String* str1, String* str2)
  {
    // compare
  } 
};

std::unordered_set<String*, StringHash, StringCmp> my_set;

答案 1 :(得分:0)

String的定义不能用C ++编译;显而易见的 解决方案是用指针替换data字段(其中 case,你可以将结构本身放入 std::unordered_set)。

可以用C ++在C ++中创建一个开放式结构 如下所示:

struct String
{
    int refcnt;
    int len;
    char* data()
    {
        return reinterpret_cast<char*>(this + 1);
    }
};
但是,如果你这样做的话,你会在薄冰上滑冰;对于其他类型 与char相比,this +不存在风险 适当调整。

如果你这样做,那么std::unordered_set就必须这样做 包含指针,而不是元素,所以我怀疑你 获得任何努力。