散列函数无法正常工作

时间:2014-06-02 20:50:07

标签: c++ opengl hash std

我已经尝试了一周了解如何使用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;
    };
}

这是我的错误功能,我需要从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 个答案:

答案 0 :(得分:1)

问题1

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

在上面一行中,您尝试将chunks[ipos] Chunk类型分配给result Chunk*类型。


问题2

调用std::unordered_map<...>::operator[]时,例如chunks[ipos]ipos)的值将默认构建除非已经存在这样的钥匙。

换句话说,这样的操作可能会更改使用它的容器。

由于成员函数 GetChunkFromPos 被标记为const,因此您不能修改类的任何成员,并且编译器会引发诊断在你面前 - 告诉你代码是不正确的。