You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:47:48