参数 1 没有从 'int' 到 'gnu_cxx::normal_iterator<int*, std::vector<int>>&&' 的已知转换。我找不到让我的代码正常工作的方法

no known conversion for argument 1 from 'int' to 'gnu_cxx::normal_iterator<int*, std::vector<int>>&&'. I'm unable to find a way to get my code working

我正在尝试执行二进制搜索以查找向量中特定元素的索引。我尝试获取第一个和最后一个元素并将它们传递给变量 high 和 low。我收到某种转换错误。错误在 BinarySearchVector 函数内部。


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

using namespace std;

    int limit=10;
    vector <int> elements; 
    void AddValueToVector(){
        cout<<"Hello World:"<<endl;
        for (int i = 0; i < limit; i++)
        {
            int a;
            cin>>a;
            elements.push_back(a);
        }   
        
    }
    void printContents(){
        cout<<"Vector elements:"<<endl;
        for (int j = 0; j < limit; j++)
        {
            cout<<elements[j]<<endl;
        }   
    }

    int binarySearchVector(vector<int>&elements,int searchval){
        sort(elements.begin(),elements.end());

        auto low= elements.begin();
        auto high= elements.end();
         while (low <= high) {
            int mid = low + (high - low) / 2;

            if (elements[mid] == searchval)
            return mid;

            if (elements[mid] < searchval)
            low = mid + 1;

            else
            high = mid - 1;
        }
        return -1;     
    }

    void search(){
        int searchval;
        cout<<"Enter value to search:"<<endl;
        cin>>searchval;
        int result= binarySearchVector(elements,searchval);
        if (result==-1)
        {
            cout<<"Not Found"<<endl;
        }else{
            cout<<"Element is found at index"<<result<<endl;
        }
        
    }
 
int main()
{
    AddValueToVector();
    printContents();
    search();
    return 0;
}


如有任何建议,我们将不胜感激。

要使用二进制搜索方法,您需要对向量进行排序。

变量lowhigh是迭代器

    auto low= elements.begin();
    auto high= elements.end();

没有将迭代器隐式转换为您尝试执行的 int 类型的对象

     while (low <= high) {
        int mid = low + (high - low) / 2;
        //... 

你至少需要写

        auto mid = low + (high - low) / 2;

        auto mid = std::next( low,  std::distance( low, high ) / 2 );
    

而且循环中的条件

     while (low <= high) {

对于空的 sub-range 是不正确的,因为在这种情况下,当 low 等于 high 时,循环体将获得控制权,并在循环体中使用迭代器进行操作循环将调用未定义的行为。你需要写

     while (low < high) {

你是说

int mid = *low + (*high - *low) / 2;

迭代器实际上是指向元素的指针。如果你想要元素本身,你需要取消引用它

因为你的 binarySearchVector 函数应该 return 找到的元素的索引(而不是迭代器)你可能不应该使用 begin()end() (那return 迭代器,不是索引)。

示例:

int binarySearchVector(std::vector<int>& elements, int searchval) {
    std::sort(elements.begin(), elements.end());

    int low = 0;                    // index of first element
    int high = elements.size() - 1; // index of last element
    
    while (low <= high) {
        int mid = low + (high - low) / 2;

        if (elements[mid] < searchval)
            low = mid + 1;
        else if (elements[mid] > searchval)
            high = mid - 1;
        else
            return mid;
    }
    return -1;
}