在STL地图中通过参考查找并返回
Find and return by reference in STL map
我有一个与这两种公共方法的类:
void StateManager::setEntityState(const EntityCTCId id, const EntityCTCState state) {
auto it = entities.find(id);
if(it != entities.end())
it->second.state = state;
else
entities.emplace(id, EntityCTC{id, state});
}
EntityCTCState StateManager::getEntityState(const EntityCTCId id) const {
auto it = entities.find(id);
if(it != entities.end())
return it->second.state;
std::stringstream ss;
ss << "Entity CTC [" << id << "] NOT found!";
throw EntityCTCNotFound{ss.str()};
}
其中entities
是std::map<EntityCTCId, EntityCTC>
。
我想重构这些方法来隔离常见的find
并通过参考找到的EntityCTC
返回,但是我无法弄清楚如何处理"未找到的键"的情况:
EntityCTC& findEntity(const EntityCTCId id) {
auto it = entities.find(id);
if(it != entities.end())
return it->second.state;
else
// ???
}
我发现的唯一解决方案是在此新方法内放置异常,但这意味着在setEntityState
内使用try-catch
来区分更新和新插入物(我读到,不应将异常管理用作逻辑分支,而仅用用于错误管理)。
您能建议我其他方法吗?
另一种方法是充分利用API。您可以看到,emplace
具有返回值。这是std::pair<iterator, bool>
。迭代器可用于访问密钥下的项目,而布尔是为了让您知道是否发生了插入或已在地图中存在的密钥。
因此,我建议您仅重写setEntityState
:
void StateManager::setEntityState(const EntityCTCId id, const EntityCTCState state) {
auto status = entities.emplace(id, EntityCTC{id, state});
if(!status.second)
status.first->second.state = state;
}
现在没有任何共同的功能需要担心,并且您只在功能中进行单个O(logn)操作,而不是两个。
附录,因为您可能会担心构建价值的成本,而不是作为过早优化的一部分。关于充分使用API的另一点是要知道可以将插入地图中的对构造的方法。这样:
auto status = entities.emplace(std::piecewise_construct,
std::forward_as_tuple(id),
std::forward_as_tuple(id, state));
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- C++错误消息*成员参考.**初学者*
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 算法问题:查找从堆栈中弹出的所有序列
- 在Windows中查找扬声器输出的当前音量级别
- 如何在C++中使用X509证书模在令牌中查找私钥
- 在STL地图中通过参考查找并返回
- 查找从列表到一个参考列表的最接近点
- 用于查找参考角度的算法