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)
在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当下标超出范围时会抛出。