gpt4 book ai didi

c++ - 在 C++ Vector 中搜索值的第一次/最后一次出现

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:14:37 31 4
gpt4 key购买 nike

我正在尝试找出最佳方法来搜索“Tracklet”类型的 vector (我自己构建的一个类),以找到其中一个变量的给定值的第一次和最后一次出现。例如,我有以下类(针对此示例进行了简化):

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
};

我有一个 vector “vector<Tracklet> tracklets”,我需要搜索结束时间点具有给定值“t”的任何轨迹。 vector 按结束时间排序(即 tracklet.end->t )。

我很乐意编写搜索算法代码,但不确定采用哪条路线。我不确定二进制搜索是否合适,因为我似乎记得它不一定会找到第一个。我在想一种方法,我使用二进制搜索找到具有正确时间的元素的索引,然后迭代返回找到第一个并向前迭代找到最后一个。我确信有比这更好的方法,因为它通过迭代浪费了二进制搜索 O(log n)。

希望这是有道理的:我费了好大劲才解释清楚!干杯!

最佳答案

如果 vector 已排序并包含值,std::lower_bound 将为您提供指向具有给定值的第一个元素的迭代器,std::upper_bound 将给你一个迭代器,指向包含该值的最后一个元素之后的一个元素。将值与返回的元素进行比较,以查看它是否存在于 vector 中。这两个函数都使用二进制搜索,所以时间是 O(logN)。

要在 tracklet.end->t 上进行比较,请使用:

bool compareTracklets(const Tracklet &tr1, const Tracklet &tr2) {
return (tr1.end->t < tr2.end->t);
}

并将 compareTracklets 作为第四个参数传递给 lower_boundupper_bound

关于c++ - 在 C++ Vector<custom_class> 中搜索值的第一次/最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1649139/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com