我有一个矢量,
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 中所有值的索引?我可以实现二进制搜索功能(我想避免线性时间复杂度),但我真的想知道它是否可以更容易地完成。
答案 0 :(得分:2)
找到std::lower_bound
,然后找到std::upper_bound
,你就可以了解你的范围。
从迭代器中,您可以使用std::distance
获取索引(但如果可以,请坚持使用迭代器!)。
这假设您的数据已经排序,但是因为您谈论的二元搜索似乎是一个明智的假设。
如果它不那么你将不得不检查每个元素,在这种情况下,任何方法都基本上与另一个方法一样好。
答案 1 :(得分:1)
如果您正在谈论二进制搜索,那么显然vector
已预先排序,这意味着您想要找到x-gamma之上的第一个元素,那么如果您确实想要使用这些值,那么它是最快的在他们处于射程范围内时进一步增加。查看lower_bound
:http://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_bound
和upper_bound
进行二元搜索,如其他答案中所述。)