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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值