您的所有地图功能都执行搜索,因此无论是否存在密钥,您总是搜索地图两次。您可以利用insert
检索是否发生插入(键不存在)或不(键存在)的事实并采取相应的行动:
std::unordered_map<int,int> mydict;
bool inserted = false;
auto position = mydict.end();
std::tie(position, inserted) = mydict.insert({key, value});
if (inserted) {
pos->second = value;
}
这相当于mydict[key] = value
,因为无论如何我们都在分配新值。对于默认构造便宜的类型operator[]
,如果这是您对地图唯一需要做的事情,我会选择使用它。
All insert
, emplace
and可以在不同情况下operator[]
执行附加构造:并在插入发生之前执行此操作,并且在 key 不存在时默认构造映射值。因此,它们对于构造/复制/移动成本高昂(、非常大...)的类型并不理想。在这种情况下,改为使用(C++17)更合适:value_type
insert
emplace
operator[]
std::thread
std::array
try_emplace
std::unordered_map<int, expensive_type> mydict;
bool inserted = false;
auto position = mydict.end();
std::tie(position, inserted) = mydict.try_emplace(key, expensive_constructor_args);
if (inserted) {
// no expensive_type has been constructed
// pos->second references the existing value
}