gpt4 book ai didi

c++ - 在 STL map 中通过引用查找和返回

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:07 24 4
gpt4 key购买 nike

我有一个包含这两个公共(public)方法的类:

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()};
}

在哪里entitiesstd::map<EntityCTCId, EntityCTC> .

我想重构那些方法来隔离常见的 find并通过引用返回找到的 EntityCTC ,但我不知道如何处理“找不到 key ”的情况:

EntityCTC& findEntity(const EntityCTCId id) {
auto it = entities.find(id);
if(it != entities.end())
return it->second.state;
else
// ???
}

我找到的唯一解决方案是在这个新方法中抛出异常,但这意味着要使用 try-catch里面setEntityState区分更新和新插入(我读到异常管理不应用作逻辑分支,而应仅用于错误管理)。

你能建议我任何其他方法吗?

最佳答案

另一种方法是充分利用 API。你看, emplace 有返回值。这是一个std::pair<iterator, bool> .迭代器可用于访问键下的项目, 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 的另一点是知道有办法分段构造插入到 map 中的对。像这样:

auto status = entities.emplace(std::piecewise_construct,
std::forward_as_tuple(id),
std::forward_as_tuple(id, state));

关于c++ - 在 STL map 中通过引用查找和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46293781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com