【发布时间】:2017-08-16 10:58:04
【问题描述】:
有没有一种简单的方法来填充二维HashMap?在 C++ 中,我可以按照以下方式做一些事情:
std::unordered_map<int,std::unordered_map<int,int>> 2dmap;
//...
2dmap[0][0] = 0;
2dmap[0][1] = 1;
//...
在我的 Rust 项目中,我正在尝试填充类似的地图:
let mut map: HashMap<i32, HashMap<i32, i32>> = HashMap::new();
//...fill the hash map here.
我能想到的唯一方法是构建每个子地图,然后将它们移动到超级地图中,如下所示:
let mut sub1: HashMap<i32, i32> = HashMap::new();
sub1.insert(0, 0);
sub1.insert(1, 1);
let mut map: HashMap<i32, HashMap<i32, i32>>::new();
map.insert(0, sub1);
有没有更简洁的方法来做到这一点?
上面的代码是我实际用例的简化,它使用枚举作为HashMap的索引:
enum Example {
Variant1,
Variant2,
//...
}
所有变体都没有值。我正在使用此语法从我的HashMap 进行查找:
let value = map[Example::Variant1][Example::Variant2];
【问题讨论】:
-
既然元组在 Rust 中工作得很好,为什么不使用
HashMap<(i32,i32),i32>? -
修改后,您仍然可以使用
HashMap<(example, example),i32>。你真的需要只用第一个example进行查找吗?如果没有,您应该使用元组... -
@Alec 是否认为使用元组会提供更紧凑的表示?或更快的查找?两个都?理由是什么?我不反对这个想法,我只是想了解其中的原因而不仅仅是解决方案。
-
争论更多的是关于语义。顺便说一下,表示将更紧凑和更快。额外的
HashMaps 不会产生额外的开销,每个分配的内存比他们需要的多,并且只需要在表中查找一次而不是两次。