2013-10-07 14 views
7

Mam wektor wektory ustanowić mapę liczb całkowitych, i chciałbym złapać wektor Out of Range error ilekroć jest wyrzucane, wykonując następujące czynności:Catching out_of_range na wektorze wektorach

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

Jednak mój kod nie wydaje się w ogóle wychwycić błąd. Nadal wydaje się chcieć uruchomić std :: endate. Czy ktoś wie, co z tym zrobić?

Odpowiedz

12

W przypadku chcesz to wyjątek, użyj std::vector::at zamiast operator[]:

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

1 - Zwraca referencję do elementu w określonej lokalizacji pos, ze sprawdzanie ograniczeń. Jeśli pos nie mieści się w zakresie od pojemnika wyjątek typu std::out_of_range wyrzuca

2

SDT :: wektor :: operator [] (size_type) nie stosuje się żadnych sprawdzić zakres (co jest dobrym). Funkcja std :: vector :: at (size_type) działa (co jest dobre dla leniwych programistów). Stąd zapewnij odpowiedni zakres lub sprawdź najpierw i wyrzuć jakiś użyteczny wyjątek (jeśli rzeczywiście musisz to zrobić).

(Uwaga: w kompilacjach debugowania może być inaczej)