Aur*_*ier 1 hashmap dereference rust
我几天才学习Rust.我认为这两个代码示例是相同的,但编译器不同意.你能解释第二部分会发生什么吗?为什么我需要解除引用key两次,但value一次?
第一部分
use std::collections::HashMap;
let mut h = HashMap::new();
h.insert(1, 1);
h.insert(2, 2);
let mut keys: Vec<i32> = Vec::new();
let mut values: Vec<i32> = Vec::new();
for (k, v) in &h {
keys.push(**k);
values.push(*v);
}
Run Code Online (Sandbox Code Playgroud)
第二部分
fn main() {
let mut v = vec![2, 3, 5, 1, 2, 3, 8, 6, 3, 1, 4, 6, 7];
use std::collections::HashMap;
let mut h = HashMap::new();
for element in &v {
let count = h.entry(element).or_insert(0);
*count += 1;
}
let mut keys: Vec<i32> = Vec::new();
let mut values: Vec<i32> = Vec::new();
for (k, v) in &h {
keys.push(**k);
values.push(*v);
}
println!("{:?}", keys);
}
Run Code Online (Sandbox Code Playgroud)
由于您没有指定您的类型HashMap,编译器推断出它.
let v = vec![1i32, 2, 3];
let mut h = HashMap::new();
for i in &v {
h.insert(i, ());
}
Run Code Online (Sandbox Code Playgroud)
h这里的类型是HashMap<&i32, ()>,类型i是&i32.为什么i有这种类型&i32?因为这是如何IntoIterator上&Vec实现.通常,当您遍历引用时,您将获得引用.
如果你想要一个HashMap不是参考的密钥类型,你可以这么说.然后,当您尝试插入引用时,您将收到不同的错误消息.
let v = vec![1i32, 2, 3];
let mut h: HashMap<i32, ()> = HashMap::new();
for i in &v {
h.insert(i, ());
}
Run Code Online (Sandbox Code Playgroud)
error[E0308]: mismatched types
--> src/main.rs:6:18
|
6 | h.insert(i, ());
| ^ expected i32, found &i32
|
= note: expected type `i32`
found type `&i32`
Run Code Online (Sandbox Code Playgroud)
然后你可以替换要插入的密钥*i.
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |