C++ 在std::vector中搜索值的近似值
我有一个向量C++ 在std::vector中搜索值的近似值,c++,search,vector,C++,Search,Vector,我有一个向量 std::vector<float> v; 它将返回v中[x-gamma,x+gamma]中所有值的索引?我可以实现一个二进制搜索函数(我想避免线性时间复杂度),但我真的想知道它是否可以以一种更简单的方式实现。如果你说的是二进制搜索,那么显然向量是预排序的,这意味着你想找到x-gamma上面的第一个元素,然后,如果你真的想使用这些值,当它们在范围内时,它会以最快的速度进一步增加。签出下限: 如果您只想找到第一个和最后一个,另一种方法是使用上限对其位置进行二元搜索,但如
std::vector<float> v;
它将返回v中[x-gamma,x+gamma]中所有值的索引?我可以实现一个二进制搜索函数(我想避免线性时间复杂度),但我真的想知道它是否可以以一种更简单的方式实现。如果你说的是二进制搜索,那么显然
向量是预排序的,这意味着你想找到x-gamma上面的第一个元素,然后,如果你真的想使用这些值,当它们在范围内时,它会以最快的速度进一步增加。签出下限:
如果您只想找到第一个和最后一个,另一种方法是使用上限
对其位置进行二元搜索,但如果有很多元素且只有少数匹配项,则这可能比递增要慢。如果您谈论的是二元搜索,那么显然是向量
的预排序,这意味着你想找到x-gamma上面的第一个元素,如果你真的想使用这些值,那么当它们在范围内时,它会以最快的速度进一步增加。签出下限:
如果您只想找到第一个和最后一个,另一种方法是使用上界
对其位置进行二进制搜索,但如果有很多元素且只有少数匹配项,则这可能比递增要慢。找到std::lower\u-bound
,然后是std::upper\u-bound
,您将拥有您的产品系列。
从迭代器中,您可以使用std::distance
(如果可以,请使用迭代器!)获取索引
这假设您的数据已排序,但由于您讨论的是二进制搜索,这似乎是一个合理的假设
如果不是,那么你无论如何都要检查每个元素,在这种情况下,任何方法基本上都和另一种方法一样好。找到std::lower\u bound
,然后找到std::upper\u bound
,你就有了自己的范围。
从迭代器中,您可以使用std::distance
(如果可以,请使用迭代器!)获取索引
这假设您的数据已排序,但由于您讨论的是二进制搜索,这似乎是一个合理的假设
如果不是这样,那么无论如何你都必须检查每个元素,在这种情况下,任何方法基本上都和另一种方法一样好。在C++11中:
std::find_if(v.begin(), v.end(),
[x,gamma](float f){return f >= x-gamma && f <= x+gamma;})
std::find_if(v.begin(),v.end(),
[x,gamma](float f){return f>=x-gamma&&f在C++11中:
std::find_if(v.begin(), v.end(),
[x,gamma](float f){return f >= x-gamma && f <= x+gamma;})
std::find_if(v.begin(),v.end(),
[x,gamma](浮动f){return f>=x-gamma&&f你返回所有值是什么意思?不是只找到第一个吗?@user2345215:这就是问题所在。tge向量有多大,它是否因为其他原因而预先排序,你在乎顺序是否改变,性能有多重要吗?通常排序是不值得的。你返回所有t是什么意思他值?难道不std::find
只找到第一个值吗?@user2345215:这就是问题所在。tge向量有多大,它是否因为其他原因而预先排序,你是否关心顺序是否改变,以及性能有多重要?排序通常不值得。“所有值的索引”,我可以实现一个二进制搜索函数(我想避免线性时间复杂“@TonyD:哦,是的,我没有注意到这一点。如果数组可以排序,那么已经有答案涵盖了这一点。“所有值的索引”,“我可以实现一个二进制搜索函数(我想避免线性时间复杂)”@托尼德:哦,是的,我没有注意到这一点。如果数组可以排序,那么已经有答案涵盖了这一点。