在Vector中查找值的索引,最接近输入

时间:2013-04-06 18:32:47

标签: c++ search vector c++11 std

是否有一种有效的方法可以在Vector中找到最接近参考值的值的索引?

2 个答案:

答案 0 :(得分:10)

计算上,如果向量没有排序,你不能指望任何小于O(n)的东西,这可能会或可能不符合你的期望。如果没有,则应更改数据结构。如果是,您可以这样使用std::min_element

#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
}

另一方面,如果对矢量进行了排序,则可以使用具有对数复杂度的std::lower_bound()std::upper_bound()

如果您认为复杂性是一个问题,因为性能,在决定更改数据结构之前进行一些测量。由于向量将它们的元素存储在连续的存储区域中,因此导致高缓存命中率的线性搜索通常会优于在数据结构上的计算上更有效的算法,该数据结构在存储器中分配其元素,导致频繁的缓存未命中。 / p>

答案 1 :(得分:1)

  1. 看起来线性搜索是你的选择(至少对于未排序的向量。看起来排序向量只是为了搜索没有意义。

  2. 一般来说,一切都取决于你在“最近”的意思。这个“最接近的”应该可以实现为一元谓词。如果元素相等,则谓词应该返回0之类的值,并且一些值越接近引用的元素值越小。

  3. 我可以从&lt; algorithm&gt;中看到最接近你所需要的算法是std::min_element,但你不仅需要范围参数,还需要参考元素(或谓词,它决定了你的元素与引用的接近程度。

  4. 或许你可以通过检查元素是否相等来获得一些好处,如果是,那就打破循环。