c++ - std::map key 与 operator< 不匹配

标签 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是有序的,编译器想要检查哪对先出现。我试着把 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 假设它们是相等的)。

关于c++ - std::map key 与 operator< 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23880160/

相关文章:

c++ - 我怎样才能去除这张图片中的噪音-openCV

python - 如何在Python中访问字典的一部分?

c# - 使用自定义 IEqualityComparer 对字典进行 XML 序列化

c++ - 从概念上理解容器上的位置访问操作

c++ - 将 PNG 图像作为 vector 或数组嵌入到 C++ 中

c++ - 为什么 std::list::reverse 有 O(n) 复杂度?

c++ - 从 stdin 获取数字列表并标记它们

c++ - C++类中的静态常量成员

scala - 反转 Scala 中的嵌套 Map

c++ - 有没有一种干净的方法可以将重载集转换为适合与 std::visit 一起使用的访问者?