参数 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;
}
如有任何建议,我们将不胜感激。
要使用二进制搜索方法,您需要对向量进行排序。
变量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) {
对于空的 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;
}
我正在尝试执行二进制搜索以查找向量中特定元素的索引。我尝试获取第一个和最后一个元素并将它们传递给变量 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;
}
如有任何建议,我们将不胜感激。
要使用二进制搜索方法,您需要对向量进行排序。
变量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) {
对于空的 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;
}