我很难调试我的一小段代码:
std::map<glm::ivec3,int> myMap;
glm::ivec3 myVec(3, 3, 3);
myMap.find(myVec);
我收到以下错误:
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|error: no match for 'operator<' in '__x < __y'
这是否意味着我无法检查 glm::ivec3
是否为比另一个小?
我认为这是因为 stl::map
是有序的,编译器想要检查哪对先出现。我试着把 key 变成一个指针,它起作用了。
有没有办法让键保持一个值而不是一个指针?这让我想问另一个问题:如何用大于运算比较无法比较或比较缓慢的东西?
谢谢! :)
你可以实现一个比较函数:
bool operator<(const glm::ivec& lhs, const glm::ivec& rhs)
{
return lhs.x < rhs.x ||
lhs.x == rhs.x && (lhs.y < rhs.y || lhs.y == rhs.y && lhs.z < rhs.z);
}
(将.x
、.y
、.z
更改为[0]
、[ 1]
, [2]
/.first()
, .second()
, .third()
等,如有必要。
how can compare with a greater than operation something that cannot be compared or that is slow to be compared?
你的指针 hack 并不少见,但并不总是有用,必须小心完成 - 具体来说,如果有人来搜索 map 并想要找到现有元素,他们需要一个指向相同元素的指针先前存储在 map 中的现有对象。或者,选择一些任意顺序,即使它在现实世界中没有特别意义 - 只要它是一致的。
如果比较速度很慢,您可以做一些事情,例如先比较哈希值,然后回退到较慢的比较以应对罕见的冲突(或者如果您的哈希足够长/足够强,返回 false
假设它们是相等的)。