Vector Subscript out of range报错修复:反转vector遇断言失败
修复vector反转时的下标越界问题
首先看你遇到的Debug Assertion Failed: vector subscript out of range错误,本质是你访问了vector不存在的下标位置,咱们一步步来排查修复:
核心问题分析
从你给出的代码片段来看,reverse函数里的循环条件while (first < 4)是硬编码的固定值,这完全不通用——如果你的vector长度不是5(下标0-4),或者调用时传入的first、last参数和这个硬编码值不匹配,肯定会出问题。另外,你代码里intList[last]的last如果传入的是vector的size()(比如vector有3个元素,size是3,下标最大是2),那直接访问intList[last]就会越界。
修复后的完整代码
#include <iostream> #include <vector> using namespace std; void reverse(vector<int>& intList, int first, int last) { // 正确的循环条件:当first小于last时交换,直到中间位置 while (first < last) { // 交换first和last位置的元素 int temp = intList[first]; intList[first] = intList[last]; intList[last] = temp; // 向中间靠拢 first++; last--; } } int main() { vector<int> nums = {1,2,3,4,5}; // 调用时注意last要传vector的最后一个元素下标,也就是size()-1 reverse(nums, 0, nums.size() - 1); // 输出验证 for (int num : nums) { cout << num << " "; } cout << endl; return 0; }
关键修复点
- 修正循环条件:把硬编码的
first <4改成first < last,这样不管vector长度多少,都会在元素交换到中间位置时停止,不会出现多余的循环导致下标越界。 - 确保last参数合法:调用reverse函数时,last必须是vector最后一个元素的下标(即
nums.size()-1),而不是vector的size值——因为vector的下标是从0开始的,size()返回的是元素个数,最大下标永远比size小1。 - 完善交换逻辑:你之前的代码没写完交换的最后一步,记得要把temp赋值给last位置的元素,同时每次交换后要让first递增、last递减,向中间移动。
额外小提示
其实C++标准库已经提供了现成的反转函数std::reverse,在<algorithm>头文件里,你可以直接用:
#include <algorithm> // ... reverse(nums.begin(), nums.end());
这样更简洁,也不容易出错,但自己实现反转逻辑用来学习是很好的练习~
内容的提问来源于stack exchange,提问作者Glovern
相关产品推荐
相关产品推荐

