提问人:Ackeem Mclennon 提问时间:2/28/2022 最后编辑:Vlad from MoscowAckeem Mclennon 更新时间:2/28/2022 访问量:694
参数 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;
}
任何建议将不胜感激。
答:
0赞
Vlad from Moscow
2/28/2022
#1
要使用二叉搜索方法,您需要对向量进行排序。
变量 和 是迭代器low
high
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 等于循环主体将获得控制权,并且循环主体内迭代器的操作将调用未定义的行为。你需要写low
high
while (low < high) {
0赞
pm100
2/28/2022
#2
你是说
int mid = *low + (*high - *low) / 2;
迭代器实际上是指向元素的指针。如果你想要元素本身,你需要取消引用它
0赞
Ted Lyngmo
2/28/2022
#3
由于您的函数应该返回找到的元素的索引(而不是迭代器),因此您可能不应该使用 and(返回迭代器,而不是索引)。binarySearchVector
begin()
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,它有很多很好的例子。
评论