20

我有一个向量向量来建立一个整数映射,并且我很想在抛出向量时捕获超出范围的错误,方法是执行以下操作:

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。有谁知道这是怎么回事?

4

2 回答 2

28

如果您希望它抛出异常,请使用1而不是:std::vector::atoperator[]

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则抛出类型异常

于 2013-10-07T17:29:45.680 回答
2

std::vector::operator [] (size_type) 不应用任何范围检查(这很好)。函数 std::vector::at(size_type) 确实(这对懒惰的程序员有好处)。因此,请确保适当的范围或先检查并抛出一些有用的异常(如果您确实必须这样做)。

(注意:在调试编译中可能会有所不同)

于 2013-10-07T18:21:14.137 回答