Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用迭代器的二进制搜索_C++_C++11_Vector_Iterator - Fatal编程技术网

C++ 使用迭代器的二进制搜索

C++ 使用迭代器的二进制搜索,c++,c++11,vector,iterator,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&

问题在评论中

#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++入门第五版,在结尾的时候,MID将等于结束,或者它将表示我们正在寻找的元素。如果mid等于end,则元素不在文本中

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

end,过去的end迭代器,表示一个无效元素,因此它不能被取消引用。您必须首先确保mid不是end,以便可以比较点的值

您的版本可能会调用未定义的行为,如果查找的元素是第一个元素,则无法工作

end,过去的end迭代器,表示一个无效元素,因此它不能被取消引用。您必须首先确保mid不是end,以便可以比较点的值

您的版本可能会调用未定义的行为,如果查找的元素是第一个元素,则无法工作

为什么不中期呢乞讨

因为修复后它会破坏这个程序,所以现在它已经被破坏了。因此,首先您必须使其正确,因为您的代码与您所说的相矛盾:

在while的末尾,mid将等于end,或者它将表示我们正在寻找的元素

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

if(mid != end)
    cout<<"Found";
else
    cout<<"Not Found";
否则,当您在示例中输入seek>98时,您将得到UB

现在在修复程序后,如果更换mid!=完中!=在while循环条件下,您的算法将中断-例如,它将始终表示为一个元素向量找到

为什么不中期呢乞讨

因为修复后它会破坏这个程序,所以现在它已经被破坏了。因此,首先您必须使其正确,因为您的代码与您所说的相矛盾:

在while的末尾,mid将等于end,或者它将表示我们正在寻找的元素

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

if(mid != end)
    cout<<"Found";
else
    cout<<"Not Found";
否则,当您在示例中输入seek>98时,您将得到UB


现在在修复程序后,如果更换mid!=完中!=在while循环条件下,您的算法将中断-例如,它总是说为一个元素向量找到。

如果我发布一个更好的实现作为答案,这是否偏离了主题?这段代码有很多特性,让我畏缩。我意识到这段代码来自于一本书。这段代码来自于这本书吗?这对我来说是不正确的——它可以导致UB。@ NrFrIDman如果你这样做会很有帮助。“SLVA是的,它是来自C++底漆的。”ToyyPrand,如果这是一个准确的代码,那么这本书的质量是有问题的,除非它是故意的,并且书解释了这个代码中的错误是不是偏离主题,如果我把一个更好的实现作为一个答案。这段代码有很多特性,让我畏缩。我意识到这段代码来自于一本书。这段代码来自于这本书吗?这对我来说是不正确的——它可以导致UB。@ NrFrIDman如果你这样做会很有帮助。“SLVA是的,它是从C++底漆。@ toyy士兵如果这是准确的代码,那么这本书的质量是值得怀疑的,除非它是故意的,书解释这个代码是什么错误,即使这个版本也可以不检查UB-MID有效。取消引用即使此版本可以有UB-取消引用前未检查mid是否有效