Debug Assertion Failed!:Expression: can't dereference out of range vector iterator(&&运算的注意事项)

发布时间 2023-04-29 16:06:20作者: 小凉拖

 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