哈希函数不能正常工作

Hashing function not working properly

本文关键字:工作 常工作 函数 不能 哈希      更新时间:2023-10-16

我已经尝试了一个星期来理解如何使用std::unordered_map和自定义散列函数。经过大量的研究,我尝试为glm::ivec3实现我自己的哈希函数。我这里的问题是,我有某种语法错误。我不知道我做错了什么,但可能是我遗漏了什么。这是我的头代码:

namespace mctest3
{
    class ChunkMap
    {
    public:
        struct KeyHasher
        {
            std::size_t operator()(const glm::ivec3& key) const
            {
                using std::size_t;
                using std::hash;
                return ((key.x * 5209) ^ (key.y * 1811)) ^ (key.z * 7297);
            }
        };

        std::unordered_map<glm::ivec3, Chunk, KeyHasher> chunks;
        ChunkMap();
        Chunk* GetChunkFromPos(const glm::vec3 &pos) const;
        glm::ivec3 GetChunkPosFromPos(const glm::vec3 &pos) const;
    };
}

这是我的bug函数,我需要从我的unordered_map(或创建一个)中检索一个值:

namespace mctest3
{
    ChunkMap::ChunkMap()
    {
    }
    Chunk* ChunkMap::GetChunkFromPos(const glm::vec3 &pos) const
    {
        glm::ivec3 ipos = glm::ivec3((int)pos.x >> Chunk::BIT_SIZE, (int)pos.y >> Chunk::BIT_SIZE, (int)pos.z >> Chunk::BIT_SIZE);
        Chunk* result = chunks[ipos]; // Bug here
        return result;
    }
}

这是我得到的两个错误:

ChunkMap.cpp|12|error: passing 'const std::unordered_map<glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk, mctest3::ChunkMap::KeyHasher>' as 'this' argument of 'std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = glm::detail::tvec3<int, (glm::precision)0u>; _Pair = std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk>; _Hashtable =|

<一口>

ChunkMap.cpp|12|error: cannot convert 'std::__detail::_Map_base<glm::detail::tvec3<int, (glm::precision)0u>, std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk>, std::_Select1st<std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk> >, true, std::_Hashtable<glm::detail::tvec3<int, (glm::precision)0u>, std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk>, std::allocator<std::pair<const glm::detail::tvec3<int, (glm::precision)0u>, mctest3::Chunk> >, std:|

问题1

Chunk* result = chunks[ipos]; // Bug here

在上面的行中,您试图将类型为Chunkchunks[ipos]分配给类型为Chunk*result


问题2

当调用std::unordered_map<...>::operator[]时,例如在chunks[ipos]中, (ipos)处的值将是默认构造的,除非已经存在这样的键。

换句话说,操作可能会改变使用该操作的容器。

因为你的成员函数GetChunkFromPos被标记为const,你不允许修改你的类的任何成员,编译器在你面前抛出一个诊断-告诉你代码是病态的。