std :: map键与运算符不匹配<

时间:2014-05-27 02:22:40

标签: c++ dictionary stl std glm-math

我很难尝试调试我的一小段代码:

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是有序的,编译器想要检查哪一对是第一个。我试图让键成为指针,它起作用了。

有没有办法让密钥保持值而不是指针?这让我问另一个问题:如何比一个大于操作的东西与无法比较或比较慢的东西进行比较?

谢谢! :)

2 个答案:

答案 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 ++散列的更多链接。

unordered_map hash function c++

C++ unordered_map using a custom class type as the key