2013-10-07 3 views
7

у меня есть вектор векторов установить карту целых чисел, и я хотел бы, чтобы поймать вектор из ошибки диапазона, когда оно брошено, выполнив следующие действия:Ловля out_of_range на вектор векторов

vector< vector<int> > agrid(sizeX, vector<int>(sizeY)); 

try { 
    agrid[-1][-1] = 5;  //throws an out-of-range 
} 
catch (const std::out_of_range& e) { 
    cout << "Out of Range error."; 
} 

Однако мой код, похоже, вообще не обнаруживает ошибку. По-прежнему кажется, что нужно запустить std :: terminate. Кто-нибудь знает, что с этим?

ответ

12

В случае, если вы хотите, чтобы бросить исключение, используйте std::vector::at вместо operator[]:

try { 
    agrid.at(-1).at(-1) = 5; 
} 
catch (const std::out_of_range& e) { 
    cout << "Out of Range error."; 
} 

1 - Возвращает ссылку на элемент в указанном месте pos, с проверкой границ. Если pos не в пределах контейнера, исключение типа std::out_of_range брошено

2

БППП :: вектор :: оператор [] (size_type) не применяет проверку диапазона (что хорошо). Функция std :: vector :: at (size_type) делает (что хорошо для ленивых программистов). Следовательно, сначала убедитесь в правильном диапазоне или проверьте, и бросьте какое-то полезное исключение (если вам действительно нужно это сделать).

(Примечание: в отладочных сборниках это может быть иначе)

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