我很难尝试调试我的一小段代码:
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
是有序的,编译器想要检查哪一对是第一个。我试图让键成为指针,它起作用了。
有没有办法让密钥保持值而不是指针?这让我问另一个问题:如何比一个大于操作的东西与无法比较或比较慢的东西进行比较?
谢谢! :)
答案 0 :(得分:3)
您可以实施比较功能:
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()
,{{1必要时,},.second()
等。
如何比较大于操作的东西无法比较或者比较慢?
你的指针黑客并不罕见,但并不总是有用,必须小心 - 特别是,如果有人来搜索地图并想要找到一个现有的元素,他们需要指向同一个指针先前存储在地图中的现有对象。或者,选择一些任意顺序,即使它在现实世界中没有特别意义 - 只要它是一致的。
如果比较速度很慢,您可以先做一些比较哈希值,然后再回到罕见冲突的慢速比较(或者如果您的哈希长/足够强,.third()
的假设他们是平等的。
答案 1 :(得分:1)
我不熟悉glm
,但从数学上来说,这并不让我感到惊讶,因为矢量没有自然顺序;即什么意思你&lt; v当两者可以在3d空间中的任何位置时。当你使用指针时,它使用地址排序,通常不是一个好主意,因为地址与键的“值”无关。你不能真正对量级进行排序,因为最终可能会有两个完全不同的向量相等。如果有一个订单很重要,你可以按字典顺序排序,比较一个维度,然后是下一个维度,等等。但是你可能想要考虑一个unordered_map
(一个哈希表),除非需要在你的问题。
这是一个讨论Java hashCode()
函数的链接,其中讨论了复合对象散列的各种方法。
http://www.javamex.com/tutorials/collections/hash_function_guidelines.shtml
对于一个有三个整数的类,我可能会(((x*p)+y)*p)+z
p
是一个小素数,比如31。(这有很多变化,而且复杂得多)功能取决于数据的结构等。)
以下是来自SO的C ++散列的更多链接。