Ловля 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. Кто-нибудь знает, что с этим?

10

Решение

Если вы хотите, чтобы оно выдало исключение, используйте std::vector::at1 вместо 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 брошен

16

Другие решения

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

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

3

По вопросам рекламы [email protected]