n00*_*dle 1 c++ search opencv class vector
我正在尝试找出最好的方法来搜索"Tracklet"类型的向量(我自己构建的一个类)来查找其变量之一的给定值的第一个和最后一个出现.例如,我有以下类(本例简化):
class Tracklet {
TimePoint *start;
TimePoint *end;
int angle;
public:
Tracklet(CvPoint*, CvPoint*, int, int);
}
class TimePoint {
int x, y, t;
public:
TimePoint(int, int, int);
TimePoint(CvPoint*, int);
// Relevant getters and setters exist here
};
Run Code Online (Sandbox Code Playgroud)
我有一个向量" vector<Tracklet> tracklets",我需要搜索结束时间点给定值为"t"的任何tracklet.矢量按结束时间(即tracklet.end->t)排序.
我很乐意编写一个搜索算法,但我不确定采用哪种路由.我不确定二进制搜索是否合适,因为我似乎记得它不一定会找到第一个.我正在考虑一种方法,我使用二进制搜索来找到具有正确时间的元素的索引,然后迭代返回以找到第一个和前进以找到最后一个.我确信有更好的方法,因为它通过迭代浪费二进制搜索O(log n).
希望这是有道理的:我努力解释一下!干杯!
如果向量被排序并包含该值,std::lower_bound将为您提供具有给定值的第一个元素std::upper_bound的迭代器,并将为您提供一个元素的迭代器,该元素超过包含该值的最后一个元素.将值与返回的元素进行比较,以查看它是否存在于向量中.这两个函数都使用二进制搜索,因此时间为O(logN).
要进行比较tracklet.end->t,请使用:
bool compareTracklets(const Tracklet &tr1, const Tracklet &tr2) {
return (tr1.end->t < tr2.end->t);
}
Run Code Online (Sandbox Code Playgroud)
并将compareTracklets作为第四个参数传递给lower_bound或upper_bound
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |