C ++ - 已排序的std :: vector中的元素索引

时间:2013-10-20 19:14:23

标签: c++ sorting vector stl

我知道std::vector已排序。使用std::binary_search我可以在日志时间中找到元素是否在向量中。不幸的是,std::binary_search在成功的情况下不返回向量中元素的索引(或者如果它确实如此,我不知道如何访问它)。 std::find将为我提供元素的迭代器,但它不使用向量进行排序的事实,因此它以线性时间而不是日志时间运行。我知道我可以简单地实现自己的二进制搜索算法,但我想知道在标准中是否有办法做到这一点。

5 个答案:

答案 0 :(得分:6)

您可以使用std::lower_bound(O(log(N))和std::distance(O(1)作为随机访问迭代器):

auto lower = std::lower_bound(v.begin(), v.end(), val);
// check that value has been found
const bool found = lower != v.end() && *lower == val;

然后,

auto idx = std::distance(v.begin(), lower);

或简单算术:

auto idx = lower - v.begin();

答案 1 :(得分:5)

您想使用lower_bound()函数。它通常有用,但它可以达到你想要的目的,这有点时髦。

答案 2 :(得分:0)

调整std::binary_search你可以得到:

template<typename Iter, typename T>
Iter my_find(Iter begin, Iter end, T value)
{

    Iter i = std::lower_bound(begin, end, value);

    if (i != end && *i == value)
        return i; // found in container
    else
        return end; // not found
}

auto it = my_find(v.begin(), v.end(), val); //it is your iterator

答案 3 :(得分:0)

使用equal_range,而不是lower_bound

您不能简单地检查std::lower_bound返回的迭代器是否与结尾不同,以了解该元素是否在集合中。如果元素不存在,std::lower_bound将返回它应该存在的位置,而不是集合的结尾。

请参阅:https://www.fluentcpp.com/2017/01/16/how-to-stdfind-something-efficiently-with-the-stl/

答案 4 :(得分:0)

您可以在STL c ++中使用lower_bound尝试类似的操作:

//让向量为v

int func(){
     int position = lower_bound(v.begin(),v.end(),element_to_be_searched) - v.begin();
     if(position == v.size()) // element not found
     {
         return -1;
     }
     else{
          return position;
     }
}