std::unordered_map 解決 ”error C2338: The C++ Standard doesn’t provide a hash for this type.”

參考
https://blog.csdn.net/HappyKocola/article/details/74188452

直接貼代碼

        struct Vertex {
            vec3 pos;
            vec3 color;
            vec2 texCoord;
        };
        std::unordered_map<Vertex, int> uniqueVertices = {};

直接這樣在 vs2013 會報 ”error C2338: The C++ Standard doesn’t provide a hash for this type.”

class Hasher {
            public:
                size_t operator()(const Vertex& vertex) const {
                    //calculate hash here.
                    return hash_val(
                        vertex.pos.x,
                        vertex.pos.y,
                        vertex.pos.z,
                        vertex.texCoord.x,
                        vertex.texCoord.y);
                }
            };
            class Equal
            {
            public:
                bool operator()(const Vertex& vertex, const Vertex&vertex2) const{
                    if (vertex.pos.x == vertex2.pos.x &&
                        vertex.pos.y == vertex2.pos.y &&
                        vertex.pos.z == vertex2.pos.z &&
                        vertex.texCoord.x == vertex2.texCoord.x &&
                        vertex.texCoord.y == vertex2.texCoord.y){
                        return true;
                    }
                    return false;
                }
            };
            std::unordered_map<Vertex, int, Hasher, Equal> uniqueVertices = {};

後來加了一個 hash計算 和 相等 的類就可以使用

hash_val 使用的是下面的方法

#include <functional>

template<typename T>
inline void hash_combine(std::size_t& seed, const T& val)
{
    seed ^= std::hash<T>()(val)+0x9e3779b9 + (seed << 6) + (seed >> 2);
}

template<typename T>
inline void hash_val(std::size_t& seed, const T& val)
{
    hash_combine(seed, val);
}

template<typename T, typename... Types>
inline void hash_val(std::size_t& seed, const T& val, const Types&... args)
{
    hash_combine(seed, val);
    hash_val(seed, args...);
}

template<typename... Types>
inline std::size_t hash_val(const Types& ...args)
{
    std::size_t seed = 0;
    hash_val(seed, args...);
    return seed;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章