我尝试根据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();
}
答案 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}}