以cv::Point为键的std::map

std::map with cv::Point as key

本文关键字:std map cv Point      更新时间:2023-10-16

我需要创建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值。

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

根据本文档,cv::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时:尽管它在这里可能更合适,但它的实现有点复杂,因为您必须组合xy这两个哈希值。为此,您可以使用boost::hash_combine或自己找出一些合理的方法,但您会发现它变得更加复杂。