C++实现merge sort归并排序时抛出std::out_of_range异常求助
错误原因定位
你代码中存在多处会触发std::out_of_range异常的逻辑错误,具体如下:
- 第一个while循环条件逻辑错误:原代码写的是
while(vec.at(i) <= m && j <= r),正确的左半部分边界判断应该是i <= m。你误将下标边界判断写成了元素值和下标m比较,当i超过左半部分边界m后,仍然会调用vec.at(i)访问越界下标,直接触发越界异常。 - 临时数组语法不标准+类型不兼容:
int temp[vec.size()]属于C++标准不支持的可变长度数组(VLA),仅部分编译器提供扩展支持;同时如果vector存储的元素不是int类型,该数组会发生类型截断错误。建议修改为std::vector<T> temp(vec.size()); - 临时数组回拷逻辑完全错误:
- 循环起始值错误:你写的
size_t p = 1,每次归并的处理区间是[l,r],应该从左端点l开始遍历,固定从1开始会漏处理首元素,若l>1还会访问未归并的无效位置 - 循环变量类型不匹配:p用无符号的
size_t类型,和int类型的r比较会发生隐式转换,可能出现意料之外的逻辑错误 - 下标访问越界:完成归并写入后k已经自增到r+1的位置,此时访问
temp[k]直接越界,正确的赋值逻辑应该是取p位置的临时值写入原数组
参考正确写法:
for(int p = l; p <= r; p++){ vec.at(p) = temp[p]; } - 循环起始值错误:你写的
内容的提问来源于stack exchange,提问作者user14287729
相关产品推荐
相关产品推荐

