我的目标是进行字符串实习。为此,我正在寻找一个哈希 容器类可以执行以下操作:
值类型如下所示:
struct String
{
size_t refcnt;
size_t len;
char data[];
};
每个String对象都有不同的大小。这将完成 opereator new + placement new。 所以基本上我想自己分配Node并稍后将其推入容器中。
以下容器不适合:
升压:: multi_index :: *
无法分配不同大小的节点
升压::侵入:: unordered_set
最初似乎工作。但有一些缺点。首先,你必须分配 桶阵列并自己维护负载因子。这是不必要的 并且容易出错。
但另一个问题难以解决:你只能搜索拥有该问题的对象 类型字符串。但是每次查找条目时分配String都是低效的 并且你只有一个std :: string作为输入。
是否有其他可用于此任务的散列容器?
答案 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
就必须这样做
包含指针,而不是元素,所以我怀疑你
获得任何努力。