1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 bool Find(int target, vector<int> array) { 5 auto begin = array.begin(), end = array.end(), mid = begin + (end - begin) / 2; 6 while ((target != *mid )&&(mid != end )) { 7 if (target < *mid) 8 end = mid; 9 else 10 begin = mid + 1; 11 mid = begin + (end - begin) / 2; 12 } 13 14 return true; 15 } 16 int main() 17 { 18 int val; 19 vector<int>array{ 2,4,7,8,11 }; 20 while (cin>>val) 21 { 22 cout << Find(val, array) << endl; 23 } 24 }
输入12时出现以下问题:
原因是输入12最后一次while语句体内会使得mid值为5这显然指向了尾后元素(超出了容器的边界),这个时候再判断while语句会首先执行target != *mid,此时对mid解引用,因此会出现Debug,解决方法用到了&&运算的一个特性:
&&语句如果左边表达式为0就不会执行右边的表达式
因此将&&两边的语句调换顺序,这个时候只要mid != end 不满足,为0就不会执行target != *mid