C++ 在C++;

C++ 在C++;,c++,abseil,C++,Abseil,异构查找意味着我们可以使用另一种有意义的兼容类型,例如absl::string\u view,将包含std::string类型的键的哈希映射编入索引。例如,以下代码可以工作(出于兼容性原因,我在代码中使用库而不是C++20): std::string word=“bird”; absl::平面散列映射单词映射; 单词映射[word]=1; std::cout您可以通过定义类型覆盖散列和比较来实现Abseil的异构查找功能。根据文档,它们必须标有is_transparenttrait以支持转换 s

异构查找意味着我们可以使用另一种有意义的兼容类型,例如
absl::string\u view
,将包含
std::string
类型的键的哈希映射编入索引。例如,以下代码可以工作(出于兼容性原因,我在代码中使用库而不是C++20):

std::string word=“bird”;
absl::平面散列映射单词映射;
单词映射[word]=1;

std::cout您可以通过定义类型覆盖散列和比较来实现Abseil的异构查找功能。根据文档,它们必须标有
is_transparent
trait以支持转换

struct VectorHash{
使用透明=无效;
大小运算符()(absl::Span v)常量{
返回absl::哈希


在评论中,您询问是否可以实现
操作符[]
override,如果映射条目存在,则不会复制向量,但仍然只执行一个哈希。这有点粗糙,仍然可能会进行额外的比较,但我认为您可以使用同时存储键和已计算哈希的帮助器类型来完成此操作:

struct VectorHashMemo{
大小散列;
absl::Span键;
显式运算符std::vector()常量{
返回{key.begin(),key.end()};
}
};
结构向量散列{
/*…现有重载*/
size_t运算符()(向量hashmemo v)常量{
返回v.hash;
}
};
结构向量机{
/*…现有重载*/
布尔运算符()(常量std::vector&a,VectorHashMemo b)常量{
返回运算符()(a、b键);
}
布尔运算符()(向量a,常量std::向量和b)常量{
返回运算符()(a.键,b);
}
布尔运算符()(VectorHashMemo b,VectorHashMemo a)常量{
返回运算符()(a键,b键);
}
};
然后,您可以只显式计算一次哈希,同时访问两次映射:

struct int\u map\t:absl::flat\u hash\u map{
使用absl::flat\u hash\u map::flat\u hash\u map;
使用absl::flat_hash_map::运算符[];
int&运算符[](absl::Span v){

VectorHashMemo hash={absl::hash

谢谢,你在哪里找到了这方面的文档?我在中发现了类似的内容,但据我所知,没有“官方”文档。我最终想要的是一种机制,以便
[]
对现有密钥进行一次哈希查找,零拷贝,或对不存在的密钥进行一次哈希查找,一次拷贝-你认为有什么方法可以做到这一点吗?顺便问一下,你知道为什么string\u视图可以转换为string,但span不能转换为vector吗?我正在查看与你相同的文档。甚至不确定是否有官方文档,这对库维护人员来说并不是非常鼓舞人心。我不知道为什么转换只存在于
string\u视图
,但如果你让我推测这是因为
string\u视图
string
紧密耦合,而
Span
是一个通用的“胖指针”这可以用于许多容器类型。我更新了答案,以便根据您的要求对限制散列计算进行一次尝试,希望它对您有效。它遵循标准库约定。除此之外没有其他内容。@重复数据消除或异构查找是应在正式文档中描述的行为示例她在《每周提示》中的表现要好于《144》@parktomatomi没有在那里与你争论。绝对至少应该有类似于“异构查找在标准库中工作”的内容.BTW:如果您提取一个函数以获得容器中与等式和哈希有关的部分的统一视图,则可以更轻松地支持其他容器,尤其是避免等式中的组合爆炸。