我使用unordered_maps的unordered_map存储对象:
std::unordered_map<int, std::unordered_map<int, WorldObject>> _worldObjects;
我使用此函数检索对象:
WorldObject& objectAtLocation(int x,int y){
if(_worldObjects.find(x)!=_worldObjects.end() && _worldObjects[x].find(y)!= _worldObjects[x].end()){
//Contains an object
}else{
//Does not contain an object at that location. What should I return ?
}
}
如果没有对象存储在x,y,那么在这个函数中指示的正确方法是什么?
例如,我可以像这样修改函数:
//return value indicating presence of object, output the variable that data is copied into.
bool objectAtlocation(int x,int y,WorldObject& output);
有什么建议吗?
编辑:使用指针是否更好?std::unordered_map<int, std::unordered_map<int, WorldObject*>> _worldObjects;
所以我可以这样做:
WorldObject* objectAtLocation(int x,int y){
WorldObject* result = nullptr;
if(_worldObjects.find(x)!=_worldObjects.end() && _worldObjects[x].find(y)!= _worldObjects[x].end()){
//Contains an object
result = _worldObjects[x][y];
}else{
//Does not contain an object at that location. Returning nullptr:
}
return result;
}
编辑:在坐标(x,y)处没有对象也不例外。因此我不需要抛出异常。我想表明那个地方什么都没有。
您是否可以提供示例代码以及您的答案,因为我不熟悉C ++,可能无法完全理解您的评论?
答案 0 :(得分:3)
&#34;标准C ++方式&#34;将返回迭代器。 如果找不到符合您搜索条件的内容,您将返回(编辑:在您的情况下,这不会工作,我误读了您使用容器的方式)< / p>
_worldObjects.end()
。
如果您的容器很复杂并且不适合返回迭代器,则可以将指针返回到您的对象,如果找不到该对象,则返回nullptr
。
编辑:
调整问题编辑中的代码示例:
WorldObject* objectAtLocation(int x,int y){
WorldObject *result = nullptr;
const auto xIter = _worldObjects.find(x)
if(xIter !=_worldObjects.end()){
const auto yIter = xIter->find(y);
if (yIter != xIter->end()){
//Contains an object
result = &(*yIter);
}
}
return result;
}
答案 1 :(得分:0)
有几种方法可以做到这一点,在我看来,没有理由做一些过于复杂的事情。所以我认为你自己的建议很好。
否则你可以返回一个指针然后检查,然后在找不到任何内容时返回null。
或者,您可以实现一个可以为空的类(可以是您继承的模板或类),以便检查您的实例是否为空对象。
但是,你可以为你的对象定义一个“默认”状态,这意味着null,你可以检查它,所以每当你找不到任何东西时,你都可以返回对null对象的引用。 null对象可以是静态的。