矢量下标超出范围,错误仅在调试模式下显示

Dan*_*ilo 2 c++ sorting vector outofrangeexception

Visual Studio Debug 显示异常“矢量下标超出范围”(仅限调试模式),但我无法检测到它。没有错,这是选择排序算法。

源代码:

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
void ascending_sort(vector<T> & list) {
    size_t i, j, index;

    for (i = 0; i < list.size() - 1; i++) {
        index = i;

        for (j = i + 1; j < list.size(); j++) {
            if (list[j] < list[index]) {
                index = j;
            }
        }

        if (index != i) {
            T item = list[i];

            list[i] = list[j];
            list[j] = item;
        }
    }
}

int main(int argc, char * argv[]) {
    vector<int> list = { 5, 1, -14, 8 };

    ascending_sort(list);

    for (size_t i = 0; i < list.size(); i++) {
        cout << list[i] << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
5
-14
8
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

ascending_sort()

if (index != i) {
    T item = list[i];

    list[i] = list[j];
    list[j] = item;
}
Run Code Online (Sandbox Code Playgroud)

您应该使用index代替j,它可能list.size()for循环之后,然后list[j]会导致超出范围的问题。将其更改为

if (index != i) {
    T item = list[i];

    list[i] = list[index];
    list[index] = item;
}
Run Code Online (Sandbox Code Playgroud)

std::vector::operator[]不执行边界检查,当下标超出范围时会导致未定义的行为。VS 似乎在 DEBUG 模式下会抛出异常,但标准并不能保证这一点。您可以std::vector::at改用,std::out_of_range当下标超出范围时会抛出。