哈希函数不能正常工作
Hashing function not working properly
我已经尝试了一个星期来理解如何使用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
在上面的行中,您试图将类型为Chunk
的chunks[ipos]
分配给类型为Chunk*
的result
。
问题2
当调用std::unordered_map<...>::operator[]
时,例如在chunks[ipos]
中,键 (ipos
)处的值将是默认构造的,除非已经存在这样的键。
换句话说,操作可能会改变使用该操作的容器。
因为你的成员函数GetChunkFromPos被标记为const
,你不允许修改你的类的任何成员,编译器在你面前抛出一个诊断-告诉你代码是病态的。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程