使用迭代器的二叉搜索

Binary search using iterator

本文关键字:搜索 迭代器      更新时间:2023-10-16

问题在评论中。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec = {15,17,19,25,45,78,98};
auto beg = ivec.begin() , end = ivec.end();
auto mid = beg + (end-beg)/2;
int sought;
cin>>sought;
while(mid != end && *mid !=sought) //why not "mid != beg"?
{
if(*mid>sought)
end = mid;
if(*mid<sought)
beg = mid + 1;
mid = beg + (end-beg)/2;
}
if(*mid == sought)
cout<<"Found";
else
cout<<"Not Found";
}

根据C++ Primer 5th Edition,在while结束时,mid将等于结束,或者它将表示我们正在查找的元素。如果 mid 等于 end,则该元素不在文本中。

我在用beg替换end后运行了该程序,它运行良好。

end,过去结束迭代器,表示无效元素,因此无法取消引用。你必须首先确保mid没有end,这样你才能比较指向的值。

您的版本可能会调用未定义的行为,如果搜索的 elem 是第一个,则不会起作用。

为什么不是"mid != beg"?

因为它会在修复后破坏该程序,所以目前它已经损坏了。所以首先你必须让它正确,因为你的代码与你所说的相矛盾:

在 while 结束时,mid 将等于 end 或者它将表示我们正在查找的元素

所以最后一个条件必须是:

if(mid != end)
cout<<"Found";
else
cout<<"Not Found";

否则,当您在示例中输入sought> 98 时,您将获得 UB。

现在,在修复程序后,如果在 while 循环条件下替换mid != endmid != beg,您的算法将中断 - 例如,对于一个元素向量,它总是说"Found"。