std :: map with cv :: Point作为键

时间:2014-10-21 09:28:50

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

我需要创建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没有<运算符。我可以准备<运算符(它仅比较x坐标):

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

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

在这种情况下如何准备有效的操作员?

1 个答案:

答案 0 :(得分:8)

根据this documentationcv::Point表示二维数据点。为此,您可以通过标准词典排序来定义运算符<

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:尽管在这里可能更合适,但实现起来要复杂一些,因为您必须将x和{的两个哈希值组合在一起{1}}。为此,你可以使用y或自己找出合理的东西,但你会发现它变得更复杂。