Thinking_Spark 2023-03-03 16:22 采纳率: 66.7%
浏览 42
已结题

vector subscript out of range 错误

#include<iostream>
#include<vector>
using namespace std;
//排序函数必有的交换函数
void swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;
}
//插入排序
void insertionSort(vector<int> &vec)
{
    cout << vec[0] << endl;
    for (int i = 0; i < vec.size(); i++) {
        for (int j = i+1 ; j > 0 && vec[j]<vec[j-1];j--) {//视角在右
            swap(vec[j], vec[j - 1]);
        }
    }
}
int main() {
    int arr2[] = { 7,5,7,6,2,4,8,10,11,15,9,2,1,2,3};
    vector<int> vec(arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));
    /*vec.reserve(100);*/
    insertionSort(vec);
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }


}

img

img

img

如图,当j=i的时候正确,j=i+1为什么就会报错?
请求大家帮忙解决一下我的苦恼!
万分感谢!
o(╥﹏╥)o

  • 写回答

1条回答 默认 最新

  • 社区专家-Monster-XH 2023-03-03 16:27
    关注

    基于Monster 组和GPT的调写:

    • 在插入排序的内层循环中,当 j=i+1 时,循环条件是 vec[j]<vec[j-1],因为 j=i+1,所以 j-1=i,即访问到了数组的左边界,此时会导致 vector subscript out of range 错误。

    为了避免这种错误,可以在内层循环的条件中增加一个判断条件 j>0,确保 j-1 不会小于 0,即:

    for (int j = i + 1; j > 0 && vec[j] < vec[j - 1]; j--) {
        swap(vec[j], vec[j - 1]);
    }
    
    
    

    这样就可以避免访问数组左边界导致的错误了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 3月3日