相关疑难解决方法(0)

如何有效地从HashMap中查找和插入?

我想做以下事情:

  • 查找Vec某个键,并将其存储起来供以后使用.
  • 如果它不存在,Vec则为该键创建一个空,但仍将其保留在变量中.

如何有效地做到这一点?当然我以为我可以使用match:

use std::collections::HashMap;

// This code doesn't compile.
let mut map = HashMap::new();
let key = "foo";
let values: &Vec<isize> = match map.get(key) {
    Some(v) => v,
    None => {
        let default: Vec<isize> = Vec::new();
        map.insert(key, default);
        &default
    }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试它时,它给了我错误,如:

error[E0502]: cannot borrow `map` as mutable because it is also borrowed as immutable
  --> src/main.rs:11:13
   |
7  |     let values: &Vec<isize> = match map.get(key) {
   |                                     --- immutable borrow occurs …
Run Code Online (Sandbox Code Playgroud)

lookup hashmap rust

83
推荐指数
1
解决办法
1万
查看次数

如何创建HashMap文字?

如何在Rust中创建HashMap文字?在Python中,我可以这样做:

hashmap = {
   'element0': {
       'name': 'My New Element',
       'childs': {
           'child0': {
               'name': 'Child For Element 0',
               'childs': {
                   ...
               }
           }
       }
   },
   ...
}
Run Code Online (Sandbox Code Playgroud)

在Go中这样:

type Node struct {
    name string
    childs map[string]Node
}

hashmap := map[string]Node {
    "element0": Node{
        "My New Element",
        map[string]Node {
            'child0': Node{
                "Child For Element 0",
                map[string]Node {}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

hashmap rust

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

从单个元素创建迭代器

我想在迭代器中添加一个元素.具体来说,我想创建一个迭代器,逐步完成序列[2,3,5,7,9,...].我能想到的最好的是

range_step_inclusive(2,2,1).chain(range_step_inclusive(3, max, 2))
Run Code Online (Sandbox Code Playgroud)

但是第一个迭代器是将单个元素2作为迭代器的一种破解.是否有更惯用的方法来创建单元素迭代器(或将元素添加到迭代器中)?

rust

9
推荐指数
3
解决办法
2125
查看次数

仅实现IndexMut而不实现Index

我正在尝试创建一个DefaultHashMap基本上是包装器的结构,HashMap区别在于当获取不在地图中的键时,默认值将被放入该键并返回.

我做了get一个get_mut方法,这很好.现在我正在尝试实现IndexIndexMut围绕这些方法包装.在这里,我遇到了两个问题.

第一个问题是由于get当密钥不存在时必须改变结构的事实,它需要一个可变引用.然而,对于签名index的方法Index&self代替&mut self,让我无法实现它.

这导致第二个问题,IndexMut需要Index实现.因此即使IndexMut没有实现问题,我也无法做到这一点,因为Index无法实现.

第一个问题很烦人,但可以理解.对于第二个,我不明白为什么要求就在那里.我想有办法解决它.现在我正在做以下事情,但我希望有人有更好的解决方案:

impl<K: Eq + Hash, V: Clone> Index<K> for DefaultHashMap<K, V> {
    type Output = V;

    fn index(&self, _: K) -> &V {
        panic!("DefautHashMap doesn't implement indexing without mutating")
    }
}

impl<K: Eq + Hash, V: Clone> IndexMut<K> for DefaultHashMap<K, V> {
    #[inline]
    fn index_mut(&mut …
Run Code Online (Sandbox Code Playgroud)

rust

5
推荐指数
1
解决办法
175
查看次数

如何使用默认值为HashMap编写安全包装

HashMap使用默认值实现了换行,我想知道它是否安全.

get被调用时,内部映射可以被调整大小和值(与先前获得的参考文献get)将被指向无效地址.我尝试使用"计算机科学中的所有问题都可以通过另一层次的间接解决"的想法来解决这个问题(Butler Lampson).我想知道这个技巧是否使这段代码安全.

use std::cell::UnsafeCell;
use std::collections::HashMap;
use std::hash::Hash;

pub struct DefaultHashMap<I: Hash + Eq, T: Clone> {
    default: T,
    map: UnsafeCell<HashMap<I, Box<T>>>,
}

impl<I: Hash + Eq, T: Clone> DefaultHashMap<I, T> {
    pub fn new(default: T) -> Self {
        DefaultHashMap {
            default: default,
            map: UnsafeCell::new(HashMap::new()),
        }
    }

    pub fn get_mut(&mut self, v: I) -> &mut T {
        let m = unsafe { &mut *self.map.get() };
        m.entry(v).or_insert_with(|| Box::new(self.default.clone()))
    }

    pub fn get(&self, …
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
394
查看次数

标签 统计

rust ×5

hashmap ×2

lookup ×1