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是否有效