相关疑难解决方法(0)

如何用两个键实现HashMap?

HashMap实现getinsert方法,它们分别采用单个不可变借位和单个值的移动.

我想要一个像这样的特性,但需要两个键而不是一个.它使用里面的地图,但它只是实现的细节.

pub struct Table<A: Eq + Hash, B: Eq + Hash> {
    map: HashMap<(A, B), f64>,
}

impl<A: Eq + Hash, B: Eq + Hash> Memory<A, B> for Table<A, B> {
    fn get(&self, a: &A, b: &B) -> f64 {
        let key: &(A, B) = ??;
        *self.map.get(key).unwrap()
    }

    fn set(&mut self, a: A, b: B, v: f64) {
        self.map.insert((a, b), v);
    }
}
Run Code Online (Sandbox Code Playgroud)

hashmap rust

22
推荐指数
2
解决办法
1949
查看次数

如何在为HashMap使用复杂键时避免临时分配?

我正在使用一个复杂的密钥,HashMap使得密钥包含两个部分,一个部分是a String,我无法弄清楚如何通过该HashMap::get方法进行查找而不String为每个查找分配新的.

这是一些代码:

#[derive(Debug, Eq, Hash, PartialEq)]
struct Complex {
    n: i32,
    s: String,
}

impl Complex {
    fn new<S: Into<String>>(n: i32, s: S) -> Self {
        Complex { n: n, s: s.into() }
    }
}

fn main() {
    let mut m = std::collections::HashMap::<Complex, i32>::new();
    m.insert(Complex::new(42, "foo"), 123);

    // OK, but allocates temporary String
    assert_eq!(123, *m.get(&Complex::new(42, "foo")).unwrap());
}
Run Code Online (Sandbox Code Playgroud)

问题出在最后的断言上.它通过,但它需要临时堆分配,因为我不能构造一个Complex没有构造一个String.

为了消除这样的临时分配,Rust提供了BorrowHashMap::get方法使用的特征.我理解如何Borrow为简单的键工作.例如,Rust标准库的PathBuf实现Borrow<Path> …

rust

13
推荐指数
2
解决办法
907
查看次数

如何在将密钥插入HashMap后保留对密钥的引用?

我想插入一个HashMap,但保持一个不可变的借用密钥传递到地方.在我的情况下,键是字符串.

这是一种方式:

use std::collections::HashMap;
let mut map = HashMap::new();
let id = "data".to_string();  // This needs to be a String
let cloned = id.clone();

map.insert(id, 5);

let one = map.get(&cloned);
let two = map.get("data");
println!("{:?}", (one, two));
Run Code Online (Sandbox Code Playgroud)

但这需要克隆.

这个工作直到Rust 1.2.0:

use std::collections::HashMap;
use std::rc::Rc;
use std::string::as_string;

let mut map = HashMap::new();
let data = Rc::new("data".to_string()); // This needs to be a String
let copy = data.clone();
map.insert(data, 5);

let one = map.get(&copy);
let two = map.get(&*as_string("data"));
println!("{:?}", (one, two));
Run Code Online (Sandbox Code Playgroud)

如何使用Rust …

rust

6
推荐指数
1
解决办法
1485
查看次数

标签 统计

rust ×3

hashmap ×1