在STL中使用返回的索引进行二进制搜索?

时间:2014-12-11 19:38:49

标签: c++ search stl binary binary-search

我需要二进制搜索功能。

我无法在标准库中找到任何会返回找到的项目索引的函数,如果找不到,将返回该按位补码下一个元素的索引大于我查找的项目。

我在寻找什么功能?

编辑: 我需要将一个项插入到已排序的向量中并对其进行排序。这就是我需要按位补充索引的原因。

9 个答案:

答案 0 :(得分:4)

我非常肯定标准库并没有包含任何可以准确你要求的东西。

为了得到你想要的东西,你可能想要从std::lower_boundstd::upper_bound开始,并将它返回的迭代器转换为索引,然后补充值的索引isn&# 39; t found。

答案 1 :(得分:1)

显然,这个“将返回按位补充”对你来说是一个大问题,我不明白你的意思。也就是说,查找std::upper_bound并查看它是否符合您的要求。

答案 2 :(得分:0)

据我所知,没有简单的STL方法可以对已排序的向量返回索引,但是您可以使用下面的示例函数:

/**
 * @param v - sorted vector instance
 * @param data - value to search
 * @return 0-based index if data found, -1 otherwise
*/
int binary_search_find_index(std::vector<int> v, int data) {
    auto it = std::lower_bound(v.begin(), v.end(), data);
    if (it == v.end() || *it != data) {
        return -1;
    } else {
        std::size_t index = std::distance(v.begin(), it);
        return index;
    }   
}

答案 3 :(得分:0)

使用STL,我们可以找到索引

vector<int> vec{1,2,3,4,5,6,7,8,9} ;
vector<int> :: iterator index;
index=lower_bound(vec.begin(),vec.end(),search_data);
return (index-vec.begin());

答案 4 :(得分:0)

int bin_search (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator low;
  low = std::lower_bound(first,last,val);
  if(low!=last && !(val<*low)){
    return (low - first + 1);
  }else{
    return 0;
  }
}

答案 5 :(得分:0)

int a = 0, b = n-1;
while (a <= b) {
    int k = (a+b)/2;
    if (array[k] == x) 
    {
        // x found at index k
    }
    if (array[k] < x) a = k+1;
    else b = k-1;
}

答案 6 :(得分:0)

使用 Jonathan 的回答,一个单行函数,for the case where we want to know at which index the value is or should have been if it does not exist

int searchInsert(vector<int>& nums, int target) {
    return lower_bound(nums.begin(), nums.end(), target) - nums.begin();
}

答案 7 :(得分:0)

这段代码应该可以正常工作

auto itr = lower_bound(v.begin(), v.end(), key) ;
index = distance(v.begin(), itr);

更多关于 std::lower_bound() - https://www.geeksforgeeks.org/stdlower_bound-in-c/

答案 8 :(得分:0)

我正在解决一个类似的问题,我需要在向量中插入一个元素,同时保持它的排序。我想出的解决方案是:

函数(修改后的二分查找)返回值应该插入的位置。

int Position(vector<int> arr, size_t size, int val)//void for commented part
{
    int start=0, middle, end=size-1;
    while(arr[start] <= arr[end])
    {
        middle = (int)((start+end+1)/2);
        if (arr[middle] < val)
        {
            start = middle+1;
        }
        else if (arr[middle] > val)
        {
            end = middle-1;
        }
        else//arr[middle]=val;
        {
            return middle;
        }
    }
    mid = (int)((start+end+1)/2);
    //arr.insert(arr.begin()+mid, val); Can I do it here? got error trying to do it.
    return mid;
}
int main()
{
    vector<int> x; cin>> val;
    mid = Position(x, x.size(), val);
    x.insert(x.begin()+mid, val);
}