在std :: vector中搜索值的近似值

时间:2014-01-04 18:07:20

标签: c++ search vector

我有一个矢量,

std::vector<float> v;

和浮点值 x 。向量 v 包含 x + epsilon ,其中 epsilon 非常小(但大于机器epsilon),但它不包含 X 即可。有没有办法,使用STL,在向量中找到 x + epsilon 的索引?

类似的东西:

int i = alternative_find(v.begin(), v.end(), x, gamma) - v.begin();

将返回 [x-gamma,x + gamma] v 中所有值的索引?我可以实现二进制搜索功能(我想避免线性时间复杂度),但我真的想知道它是否可以更容易地完成。

3 个答案:

答案 0 :(得分:2)

找到std::lower_bound,然后找到std::upper_bound,你就可以了解你的范围。

从迭代器中,您可以使用std::distance获取索引(但如果可以,请坚持使用迭代器!)。

这假设您的数据已经排序,但是因为您谈论的二元搜索似乎是一个明智的假设。

如果它那么你将不得不检查每个元素,在这种情况下,任何方法都基本上与另一个方法一样好。

答案 1 :(得分:1)

如果您正在谈论二进制搜索,那么显然vector已预先排序,这意味着您想要找到x-gamma之上的第一个元素,那么如果您确实想要使用这些值,那么它是最快的在他们处于射程范围内时进一步增加。查看lower_boundhttp://en.cppreference.com/w/cpp/algorithm/lower_bound

如果你只是想找到第一个和最后一个,另一个选择是使用upper_bound二进制搜索到它的位置,但如果有很多元素并且只有少数匹配,那么这可能比递增慢。

答案 2 :(得分:1)

在C ++ 11中:

std::find_if(v.begin(), v.end(),
    [x,gamma](float f){return f >= x-gamma && f <= x+gamma;})

从历史上看,您必须编写自己的谓词,并且使用常规for循环可能更简单。

(虽然,关于你的最后一句,如果向量是或可以排序,那么你可以使用lower_boundupper_bound进行二元搜索,如其他答案中所述。)