C++ 返回给定单词所在的存储桶编号

C++ 返回给定单词所在的存储桶编号,c++,hashmap,unordered-map,bucket,C++,Hashmap,Unordered Map,Bucket,我正在做一个项目,我很难理解这一点。 我有一个无序的映射,我把它命名为Hash 目标是提供两个单独的函数,返回给定单词所在的桶号。我知道,对于一个函数,我可以执行类似于返回Hash.bucket(word)的操作但是,我在网上看到有人这样做: if(Hash.count(word)!=0) return Hash.bucket(word); 为什么他们把它和0比较 另外,除了使用.bucket()?据我所知,他们将它与零进行比较,以便您能够确保它确实存在于地图中。如果返回Hash.bu

我正在做一个项目,我很难理解这一点。 我有一个无序的映射,我把它命名为
Hash

目标是提供两个单独的函数,返回给定单词所在的桶号。我知道,对于一个函数,我可以执行类似于
返回Hash.bucket(word)的操作但是,我在网上看到有人这样做:

if(Hash.count(word)!=0)
    return Hash.bucket(word);
为什么他们把它和0比较


另外,除了使用
.bucket()

据我所知,他们将它与零进行比较,以便您能够确保它确实存在于地图中。如果
返回Hash.bucket(word)
对于您尚未放入映射的内容,它仍将返回密钥哈希对应的bucket。该函数执行此操作时不检查单词是否已存在于映射中。if语句确保只有当您知道它已经在那里时,您才能得到它的bucket


我不知道有什么不同的方法可以把桶号从我的脑海中抹去。

请提供一个我建议与您详细讨论的方法。虽然Duckie的专长是调试,但他也非常擅长帮助您解释他人代码背后的逻辑。这取决于上下文。当然,如果哈希表可能为空,则需要进行某种测试(尽管在这种情况下,更适合使用
bucket\u count
,因为它不需要实际的查找)。基本上,如果没有bucket,
unordered_map::bucket
的行为是未定义的。我能想到的另一个原因是,您看到的代码期望,如果此函数返回一个有效的bucket number,那么它保证单词实际上在容器中。仅仅调用
bucket
并不能保证这一点。从C++20开始,您可以编写
if(Hash.contains(word))…
而不是使用
.count(word)!=0
-只是更直接和可读的一点点。“除了使用.bucket()”->没有更好的方法了/有一些疯狂的选项,比如对bucket和bucket内容进行暴力迭代“它仍然会返回密钥散列的bucket”-其中有一些输入错误,因为没有意义,但您似乎明白它将做什么:将哈希函数应用于键,并将映射函数(
%
&
)应用于bucket\u count,即插入或查找该键的正确位置,从而返回bucket。我想我重新编写了该部分,使其更加清晰。谢谢你,伙计。