当std :: map :: at去out_of_range时要返回什么?

Jal*_*har 8 c++ exception c++11

在游戏中,我想搜索项目地图并返回位于棋盘特定方块上的项目.但如果广场是空的怎么办?(这些项目没有存储在董事会结构中.对于这个问题,我没关系.)我有下面的代码,但是我应该怎样做才能返回"空"参考?

map<pair<int, int>, Item*> _items;

Item& itemAt(int row, int col) const {
    try {  
        return *_items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return // what goes here?            
    } 
}
Run Code Online (Sandbox Code Playgroud)

或者这是错误的方法,我应该使用find()

And*_*owl 12

如果在程序中找不到项目不是错误条件,则不应返回引用(因为引用不能为null).相反,您应该返回一个(非拥有的,最可能的)指针,并nullptr在以后找不到该项时返回:

Item* itemAt(int row, int col) const {
    try {  
        return _items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return nullptr;
    }   
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果没有找到一个项目是一个错误,那么你可以返回一个引用(当找到该项目时)并未找到该项目时传播该异常 - 处理它的责任属于部分您的代码具有如何处理它的战略知识:

Item& itemAt(int row, int col) const {
    return *_items.at(make_pair(row, col));
}
Run Code Online (Sandbox Code Playgroud)


小智 9

在这种情况下,使用指针作为表示"零个或一个对象"的方法很有用:

Item* itemAt(int row, int col) const {
    try {
        return _items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return nullptr;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,使用std::map::find()可能是一种更快速,更清洁的方法.

  • +1使用`find`,这就是它的用途! (4认同)