参数 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

提问人:Ackeem Mclennon 提问时间:2/28/2022 最后编辑:Vlad from MoscowAckeem Mclennon 更新时间:2/28/2022 访问量:694

问:

我正在尝试进行二进制搜索以查找向量中特定元素的索引。我尝试获取第一个和最后一个元素并将它们传递给变量 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;
}


任何建议将不胜感激。

C++ 数组向 迭代器 C++17

评论


答:

0赞 Vlad from Moscow 2/28/2022 #1

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

变量 和 是迭代器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) {

对于空子范围是不正确的,因为在这种情况下,when 等于循环主体将获得控制权,并且循环主体内迭代器的操作将调用未定义的行为。你需要写lowhigh

     while (low < high) {
0赞 pm100 2/28/2022 #2

你是说

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

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

0赞 Ted Lyngmo 2/28/2022 #3

由于您的函数应该返回找到的元素的索引(而不是迭代器),因此您可能不应该使用 and(返回迭代器,而不是索引)。binarySearchVectorbegin()end()

例:

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

评论

0赞 Ackeem Mclennon 3/1/2022
谢谢,这个解决方案对我有用。这是我第一次与Vectors合作,你知道有什么有用的资源吗?
0赞 Ted Lyngmo 3/1/2022
@AckeemMclennon 不客气。我认为 SO 是一个很好的资源。如果你搜索 c++ vector,它有很多很好的例子。