Go中的地图 - 如何避免双键查找?

时间:2015-01-19 00:38:52

标签: go

假设我想要更新地图中的某些现有值,或者如果找不到该键则执行其他操作。如何在不执行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));
}

2 个答案:

答案 0 :(得分:4)

Go不会像C ++那样公开地图的内部(键,值)对数据结构,所以你不能完全复制它。

一种可能的解决方法是制作地图指针的值,这样您就可以在地图中保留相同的值,但更新它们指向的内容。例如,如果mmap[int]*int,则可以使用以下内容更改值:

v := m[10]
*v = 42

话虽如此,如果减少哈希查找次数所带来的节省将被额外的内存管理开销所吞噬,我也不会感到惊讶。因此,无论您采用何种解决方案,都值得进行基准测试。

答案 1 :(得分:2)

你做不到。 Python dicts的情况实际上是相同的。然而,这不重要。查找和分配到Go映射都是摊销O(1)。结合这两个操作具有相同的时间复杂度。