在点矢量中搜索/找到点的最佳方法是什么?

时间:2013-12-20 16:37:52

标签: c++ opencv

我尝试根据x坐标对点进行排序,并对矢量进行二分搜索,但我找不到我知道它们存在的点。

感谢您的帮助。

struct PointSort {
    bool operator() (cv::Point pt1, cv::Point pt2) { return (pt1.x < pt2.x);}
} mySort;

.
.
.
std::sort (temp.begin(), temp.end(), mySort);
if (std::binary_search(temp.begin(), temp.end(), somePoint, mySort)){
    doSomething();
}

2 个答案:

答案 0 :(得分:7)

类似于:

struct point { int x, y; };
std::vector<point> pts { {1,2}, {4,5} };
auto comp_x=[](const point& p1, const point& p2) {
    return p1.x < p2.x;
};
std::sort(begin(pts), end(pts), comp_x);
//using binary search
auto it=std::lower_bound(begin(pts), end(pts), some_point, comp_x);
//it now points to the point

下界函数使用二进制搜索来查找第一个元素(upper_bound找到最后一个元素)并为您提供该元素的迭代器。

如果您不需要对其进行排序,我只会使用std::find

auto it=std::find_if(begin(pts), end(pts), [&](const point& p) {
        return p.x==some_point.x;
    }
);

答案 1 :(得分:0)

如果您只想找到与您提供的Point匹配的std::vector<Point> points; // points is filled somewhere Point p { 1, 2 }; std::vector<Point>::iterator it = std::find(points.begin(), points.end(), p);

std::find_if

如果您想自定义比较,可以使用Point pt { 1, 2 }; std::vector<Point>::iterator it = std::find_if(points.begin(), points.end(), [&](const Point& p) { return pt.x == p.x; });

std::find

为了上帝的缘故,忽略“AAA”的废话......

旁注:您的向量不需要排序以使用std::sort(temp.begin(), temp.end(), [](const Point& p1, const Point& p2) { return p1.x < p2.x; }); (尽管如果它会加速)。如果您可以使用C ++ 11标准,则无需创建仿函数:

Point

此外,如果float x = SOME_VALUE; float y = SOME_OTHER_VALUE; float EPSILON = 0.000000001; bool are_equal = std::abs(x - y) < EPSILON; 类的元素是浮点数,则不希望使用直线相等进行比较。相反,选择一些小数作为您可接受的最低精度( epsilon ),并将两个值之间的差值进行比较:

{{1}}