2016-08-11 9 views
2

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; 
} 

Выход:

0 
5 
-14 
8 

ответ

4

В ascending_sort(),

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

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

Вы должны использовать index вместо j, который может быть list.size() после цикла for, затем list[j] вызовет проблему вне диапазона. Измените его на

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

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

std::vector::operator[] не выполняет проверку границ, это приводит к неопределенному поведению, когда индекс находится вне диапазона. Кажется, VS будет генерировать исключение в режиме DEBUG, но это не гарантируется стандартом. Вместо этого вы можете использовать std::vector::at, который выкинет std::out_of_range, когда индекс окажется за пределами допустимого диапазона.

 Смежные вопросы

  • Нет связанных вопросов^_^