参考
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;
}