问题出在评论中。
#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第5版,在while结束时,mid将等于end或它将表示我们正在寻找的元素。如果mid等于end,则元素不在文本中。
我用end
替换beg
后运行程序,运行得很好。
答案 0 :(得分:4)
end
,过去的结束迭代器,表示无效元素,因此无法解除引用。您必须首先确保mid
不是end
,因此您可以比较指向的值。
您的版本可能会调用未定义的行为,如果搜索到的elem是第一个,则无法使用。
答案 1 :(得分:1)
为什么不“mid!= beg”?
因为它会在修复后打破这个程序,目前它已经坏了。所以首先你必须使它正确,因为你的代码与你所说的相矛盾:
在while结束时,mid将等于end或者它将表示我们正在寻找的元素
所以最后一个条件必须是:
if(mid != end)
cout<<"Found";
else
cout<<"Not Found";
否则,当您输入sought
&gt;时,您会获得UB在你的例子中98。
现在修复程序后,如果在while循环条件中将mid != end
替换为mid != beg
,则算法将会中断 - 例如,对于一个元素向量,它将始终显示“Found”。