C++ 查找向量中最接近输入的值的索引

C++ 查找向量中最接近输入的值的索引,c++,search,vector,c++11,std,C++,Search,Vector,C++11,Std,有没有一种有效的方法可以找到向量中最接近参考值的值的索引?计算上,如果向量没有排序,你不能期望任何小于O(n)的值,这可能满足你的期望,也可能不满足你的期望。如果没有,您应该更改数据结构。如果是,您可以使用std::min_元素,方法如下: #include <vector> #include <algorithm> #include <iostream> int main() { int refElem = 42; std::vector&

有没有一种有效的方法可以找到向量中最接近参考值的值的索引?

计算上,如果向量没有排序,你不能期望任何小于O(n)的值,这可能满足你的期望,也可能不满足你的期望。如果没有,您应该更改数据结构。如果是,您可以使用
std::min_元素
,方法如下:

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    int refElem = 42;
    std::vector<int> v{1, 5, 36, 50};
    auto i = min_element(begin(v), end(v), [=] (int x, int y)
    {
        return abs(x - refElem) < abs(y - refElem);
    });

    std::cout << std::distance(begin(v), i); // Prints 2
}
#包括
#包括
#包括
int main()
{
int-refElem=42;
std::向量v{1,5,36,50};
自动i=最小元素(开始(v),结束(v),[=](整数x,整数y)
{
返回abs(x-refElem)看起来线性搜索是你们的选择(至少对于未排序的向量来说是这样)。看起来仅仅为了搜索而对向量排序并没有意义

  • 一般来说,一切都取决于“最近”下的含义。此“最近”可能应作为一元谓词实现。如果元素相等,则谓词应返回类似于0的值,并且某个值越大,则引用中的元素越不接近

  • 正如我从中看到的,您不仅需要范围参数,还需要引用元素(或谓词),它决定了您的元素与引用的“距离”有多近

  • 检查元素是否相等,如果相等,打破循环,可能会给您带来一些好处


  • 效率有多高?有
    std::find
    。我不确定你的最后几句话是否是
    std::upper/lower_-bound
    。在随机未排序数据的向量中,它将是O(n)。您可以编写自己的循环或使用一种标准算法。我无法确定您所说的高效是什么意思。jrok是正确的,传统上,任何算法在未排序数据上的效率都不会超过O(n),但有时人们用efficient来表示完全不同的意思,比如“使用尽可能少的代码”,或者“提交作业时不会让我难堪”。所以我会更准确地定义你的意思。