2013-10-07 51 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

在std ::矢量::運算符[](SIZE_TYPE)不應用任何範圍檢查(這是很好的)。函數std :: vector :: at(size_type)確實(這對於懶惰的程序員來說很好)。因此,先確保一個適當的範圍或檢查,並拋出一些有用的例外(如果你真的必須這樣做)。

(注意:在調試彙編時可能會有所不同)