Go 中的地图 - 如何避免双键查找?
Maps in Go - how to avoid double key lookup?
假设我想更新地图中的一些现有值,或者在找不到键的情况下执行其他操作。如果不执行 2 次查找,我该怎么做?以下 C++ 代码的 golang 等价物是什么:
auto it = m.find(key);
if (it != m.end()) {
// update the value, without performing a second lookup
it->second = calc_new_value(it->second);
} else {
// do something else
m.insert(make_pair(key, 42));
}
Go 不会像 C++ 那样公开地图的内部(键,值)对数据结构,因此您无法完全复制它。
一种可能的解决方法是创建地图指针的值,这样您就可以在地图中保留相同的值,但更新它们指向的内容。例如,如果 m
是 map[int]*int
,您可以更改值:
v := m[10]
*v = 42
话虽如此,如果减少散列查找次数所节省的费用会被额外的内存管理开销所消耗,我不会感到惊讶。因此,无论您选择哪种解决方案,都值得进行基准测试。
你不能。这种情况实际上与 Python 字典相同。不过应该没关系。对 Go 映射的查找和分配都是分摊的 O(1)。合并这两个操作具有相同的时间复杂度。
假设我想更新地图中的一些现有值,或者在找不到键的情况下执行其他操作。如果不执行 2 次查找,我该怎么做?以下 C++ 代码的 golang 等价物是什么:
auto it = m.find(key);
if (it != m.end()) {
// update the value, without performing a second lookup
it->second = calc_new_value(it->second);
} else {
// do something else
m.insert(make_pair(key, 42));
}
Go 不会像 C++ 那样公开地图的内部(键,值)对数据结构,因此您无法完全复制它。
一种可能的解决方法是创建地图指针的值,这样您就可以在地图中保留相同的值,但更新它们指向的内容。例如,如果 m
是 map[int]*int
,您可以更改值:
v := m[10]
*v = 42
话虽如此,如果减少散列查找次数所节省的费用会被额外的内存管理开销所消耗,我不会感到惊讶。因此,无论您选择哪种解决方案,都值得进行基准测试。
你不能。这种情况实际上与 Python 字典相同。不过应该没关系。对 Go 映射的查找和分配都是分摊的 O(1)。合并这两个操作具有相同的时间复杂度。