为何用for循环检查vector有序性时功能异常?请排查问题
原代码的Bug分析
你的原代码存在三个关键问题,导致功能异常:
1. 数组越界访问(核心问题)
原循环逻辑:
for(int i = 0; i < list_of_numbers.size(); i++){ if(list_of_number[i] > list_of_numbers[i + 1]){ list_is_sorted = false; } }
当i遍历到list_of_numbers.size()-1(即最后一个元素的索引)时,i+1等于list_of_numbers.size(),而vector的合法索引范围是0到size()-1,此时访问list_of_numbers[i+1]属于越界访问,会读取到内存中的随机垃圾值。这个随机值几乎一定会触发list_is_sorted = false,这就是你测试时始终输出“the list is not sorted”的原因。
2. 函数返回值类型不匹配
原函数声明为:
vector <int> is_list_sorted(vector <int> list_of_numbers)
但实际返回的是bool类型的list_is_sorted,这种类型不匹配会导致编译错误,或者运行时的未定义行为,直接破坏主函数中的判断逻辑。正确的返回值类型应该是bool。
3. 变量名拼写错误
原代码中if(list_of_number[i] > list_of_numbers[i + 1])里的list_of_number少了末尾的s,正确的变量名应该是list_of_numbers(和函数参数一致)。这个错误会导致编译器报错,若你实际运行的代码中存在此问题,根本无法正常执行。
修改后的代码解决了这些问题:循环从i=1开始,遍历到size()-1,访问i-1始终是合法索引,不会越界;同时逻辑上和原代码的“前一个元素大于后一个则未排序”等价,只是换了判断方向(后一个元素小于前一个则未排序),因此功能恢复正常。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

