这个返回元素位置的基于循环的函数有什么问题?

What is wrong with this loop-based function that returns the position of an element?

本文关键字:函数 循环 问题 什么 返回 元素 位置 于循环      更新时间:2023-10-16

此函数从位置"start"在给定向量中查找整数"键"。如果找到键,它会返回键的位置。但是如果它没有找到键,它应该返回 -1。

但是,它只返回 -1 作为输出。如果删除 else 语句,该函数工作正常,但显然我需要它。

那么这个函数有什么问题呢?请用简单的术语解释一下,我是C++新手。谢谢你的帮助。

int Sequential_Search(const vector<int>&v, int key, int start){
int result = 0;
int i;
for(i = start; i < v.size(); i++){
if(v[i] == key){
result = i; 
}
else{
result = -1;
}
}
return result;  
}

这很容易理解:

for(i = start; i < v.size(); i++){
if(v[i] == key){
result = i; 
}
else{
result = -1;
}
}

假设您的向量包含 [1, 2, 3, 4],并且您从索引 0 开始搜索 2:以下是您的代码正在执行的操作:

i = 0: (v[i] : 1) == 2 -> false: result = -1
i = 1: (v[i] : 2) == 2 -> true: result = 1
i = 2: (v[i] : 3) == 2 -> false: result = -1
i = 3: (v[i] : 4) == 2 -> false: result = -1

当你找到你的值时,你仍然会继续读取其他值,而你应该停止。

  • 要么使用break,要么在v[i] == key条件下直接返回(return i(;
  • 要么通过检查结果在 for 条件 (result == -1 && i < v.size()(

每条评论:breakreturn的情况(最后一个并不难(:

int Sequential_Search(const vector<int>&v, int key, int start){
int result = -1; // important for 'break'
for(int i = start; i < v.size(); i++){
if(v[i] == key){
result = i; break;
}
}
return result;  
}
int Sequential_Search(const vector<int>&v, int key, int start){
for(int i = start; i < v.size(); i++){
if(v[i] == key){
return i;
}
}
return -1;  
}

当循环找到键时,它会设置result = i- 但它不会停止循环。在下一次迭代中,v[i]可能不等于key,循环result重置为-1。该函数返回-1除非key恰好与最后一个元素匹配。

else 语句失败的原因是,在许多情况下,键不会是向量中的最后一项。

如果键为 3,整数的向量为 <1,3,4>,则 for 循环将遍历总共 3 次。在第一次迭代中,它将进入 else 语句,因为我们没有在第 0 个索引处找到键。结果为 -1。在第二次迭代中,我们找到了关键!将结果设置为 i = 1。第三次迭代将再次进入 else 语句,并将结果设置回 -1。

要解决此问题,您可以使用"break"在找到结果后立即离开 for 循环。将结果设置为 I,然后用休息符跟随它;这将确保如果找到结果,您将不会再次进入 else 语句并将其重置为 -1。