使用迭代器进行二进制搜索

时间:2017-08-24 21:13:22

标签: c++ c++11 vector iterator

问题出在评论中。

#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后运行程序,运行得很好。

2 个答案:

答案 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”。