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

S J*_*S J 0 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();
}
Run Code Online (Sandbox Code Playgroud)

111*_*111 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
Run Code Online (Sandbox Code Playgroud)

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

如果你不需要它进行排序,我会使用std::find.

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

  • @JamesKanze究竟是怎么滥用汽车的呢?你会做什么`std :: vector <point> :: const_iterator`根本不提高可读性,它只是增加了对容器类型的依赖.当编译器知道我在说什么时,为什么要输入两次名称? (3认同)
  • "当编译器知道我在说什么时":我更担心必须阅读代码的人.但是我的评论并不是针对迭代器,而是针对lambda的`auto`.(而且我担心Herb会提出与好主意一样多的反模式.他非常善于解释事物,但软件工程并不是他的强项.) (3认同)