c++ - String-Interning 使用哪个容器

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

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

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

值类型如下所示:

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

每个字符串对象都有不同的大小。这将通过 运算符新 + 放置新。 所以基本上我想自己分配节点并稍后将其推送到容器中。

以下容器不适合:

  • std::unordored_set
  • boost::multi_index::*

    不能分配不同大小的节点

  • boost::intrusive::unordered_set

    一开始似乎有效。但有一些缺点。首先你必须分配 桶数组并自己维护负载因子。这是不必要的 并且容易出错。

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

是否有任何其他哈希容器可用于此任务?

最佳答案

我认为您无法使用任何标准容器做到这一点。

您可以做的是将指针存储到 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;

关于c++ - String-Interning 使用哪个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13701144/

相关文章:

c++ - C++代码中的#if语句

java - put() 之后哈希表仍为空

c++ - Boost 多索引容器与基于 std::unordered_map( map 的 map )的多级映射容器

c++ - Boost Multi-Index 中的多索引查询

c# - 哈希表或字典查找时间

c++ - Boost::Multiindex 与字符串索引 boost::unordered_map

c++ - `core constant expression` 与 `constant expression`

c++ - `shared_ptr<SubClass>` 如何成为 `shared_ptr<BaseClass>` 的子类?

c++ - 指向动态数组的 auto_ptr

algorithm - 为什么哈希表平均访问时间不变?