Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在std::vector中搜索值的近似值_C++_Search_Vector - Fatal编程技术网

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:哦,是的,我没有注意到这一点。如果数组可以排序,那么已经有答案涵盖了这一点。“所有值的索引”,“我可以实现一个二进制搜索函数(我想避免线性时间复杂)”@托尼德:哦,是的,我没有注意到这一点。如果数组可以排序,那么已经有答案涵盖了这一点。