【问题标题】:std::map with cv::Point as key以 cv::Point 为键的 std::map
【发布时间】:2014-12-16 11:27:48
【问题描述】:

我需要创建std::map<cv::Point, double>cv::Point 是 OpenCV 库中的一种点。它有如下字段:xy

cv::Point 当然没有< 运算符。您知道如何定义它以对std::map 中的元素进行最佳访问吗?

换句话说。例如,我有 20000 点。我需要快速访问每个点。

例如:

std::map<cv::Point, double> myMap;

Point p(10, 234);
int value = 777;
myMap[p] = value; // I need this operation quite fast so I decided to use std::map

但是 cv::Point 没有 &lt; 运算符。我可以准备&lt; 这样的运算符(例如只比较x坐标):

bool operator<(const cv::Point a, const cv::Point b)
{
    return a.x < a.x;
}

但我想这不是好的运营商。许多点具有相同的 x 值。

这种情况下如何准备高效算子?

【问题讨论】:

  • 密钥需要可复制和可分配:stackoverflow.com/questions/6573225/…
  • @EdChum:这不是问题所在。
  • 我在文档中找不到任何名为 cv::Point 的类型。我只看到Point_,这是一个模板。
  • @peter55555 那么也许你应该澄清你到底遇到了什么问题。
  • 订购了std::map这个事实有什么用吗? std::unordered_map(或它的前身)会更合适吗?

标签: c++ algorithm opencv data-structures stl


【解决方案1】:

根据this documentationcv::Point 表示二维数据点。为此,您可以通过标准字典顺序定义您的运算符&lt;

bool operator<(cv::Point const& a, cv::Point const& b)
{
    return (a.x < b.x) || (a.x == b.x && a.y < b.y);
} 

编辑:当您考虑使用unordered_map:虽然在这里可能更合适,但实现起来有点复杂,因为您必须组合xy 的两个哈希值。为此,您可以使用boost::hash_combine 或自己找出一些合理的东西,但您会发现它变得更加复杂。

【讨论】:

  • 非常感谢。我想unordered_map。是很难写散列函数。 :( 我的点是矩形的点(矩形的所有点)。我决定使用 std::map。
  • @peter55555:写有函数是琐碎。像x ^ y 这样的东西就可以了!唯一的问题是 std::hash 是一个 struct 模板,你必须专门研究它。 boost 版本的默认实现调用了不合格的hash_valuefunction,它的工作方式更像运算符。我不知道为什么它没有包含在标准中。
  • @Jan Hudec:是的,人们肯定会找到即将起作用的东西。但是,我不想确定两个size_t 的哪个二进制函数将做公平/好/最好的......这就是人们通常试图通过使用标准库来避免的那种决定。所以我同意:hash_combine 应该在标准中,或者std::hash 的更好的专业化std::arraystd::tuple
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多