如何在不烦恼借阅检查器的情况下为双向地图建模?

n

为什么我不能存储的值,并在相同的结构,以该值的参考?我了解到我无法在同一结构中存储值和引用。

提议的解决方案是:

最简单,最推荐的解决方案是不要尝试将这些项目放在同一结构中。这样,您的结构嵌套将模仿代码的生命周期。将拥有数据的类型放到一个结构中,然后提供一些方法,使您可以根据需要获取引用或包含引用的对象。

但是,我不知道如何在我的具体情况下应用此方法:

我想构建双向地图,由两个内部HashMaps实现。显然,其中之一必须拥有数据。但是,另一部分对于双向地图也是必不可少的,因此我看不到如何在保持双向地图接口的同时将两者分开。

struct BidiMap<'a, S: 'a, T: 'a> { ? }
fn put(&mut self, s: S, t: T) -> ()
fn get(&self, s: &S) -> T
fn get_reverse(&self, t: &T) -> S
Shepmaster

在这种情况下,最简单的解决方案是像使用垃圾收集器的语言一样工作:

use std::collections::HashMap;
use std::rc::Rc;
use std::hash::Hash;
use std::ops::Deref;

struct BidiMap<A, B> {
    left_to_right: HashMap<Rc<A>, Rc<B>>,
    right_to_left: HashMap<Rc<B>, Rc<A>>,
}

impl<A, B> BidiMap<A, B>
where
    A: Eq + Hash,
    B: Eq + Hash,
{
    fn new() -> Self {
        BidiMap {
            left_to_right: HashMap::new(),
            right_to_left: HashMap::new(),
        }
    }

    fn put(&mut self, a: A, b: B) {
        let a = Rc::new(a);
        let b = Rc::new(b);
        self.left_to_right.insert(a.clone(), b.clone());
        self.right_to_left.insert(b, a);
    }

    fn get(&self, a: &A) -> Option<&B> {
        self.left_to_right.get(a).map(Deref::deref)
    }

    fn get_reverse(&self, b: &B) -> Option<&A> {
        self.right_to_left.get(b).map(Deref::deref)
    }
}

fn main() {
    let mut map = BidiMap::new();
    map.put(1, 2);
    println!("{:?}", map.get(&1));
    println!("{:?}", map.get_reverse(&2));
}

当然,你想有多少更严格的代码,因为这可以让你打破双向映射。这只是向您显示解决问题的一种方法。

显然,其中之一必须拥有数据

显然,这不是正确的^ _ ^。在这种情况下,两个地图使用共享所有权Rc

这个解决方案进行基准测试,以了解它是否足够有效。

做任何更有效的事情都需要对所有权进行更多的思考。例如,如果left_to_right地图拥有数据,而您在另一个地图中使用了原始指针,则在重新分配第一个地图后,该指针将失效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不检查null或0的情况下为sqlparameter NULL值分配值?

来自分类Dev

如何在不检查null或0的情况下为sqlparameter NULL值分配值?

来自分类Dev

Web服务器如何在不安装的情况下为网站查看器工作?

来自分类Dev

如何在不使用设置器的情况下为类变量设置值

来自分类Dev

如何在没有模型的情况下为@ Html.TextBox()添加验证器

来自分类Dev

如何在没有HDMI的情况下为Android Things连接扬声器

来自分类Dev

如何在没有构造函数的情况下为“this”赋值

来自分类Dev

Cakephp:如何在不创建模型/控制器的情况下获取表数据?

来自分类Dev

antlr4:如何在没有生产规则的情况下为令牌生成侦听器回调?

来自分类Dev

在MVC 5中如何在没有默认操作的情况下为控制器设置路由?

来自分类Dev

如何在没有身份服务器的情况下为NFS的Windows客户端设置身份?

来自分类Dev

如何在不使用触发器的情况下为一对多关系设置额外约束

来自分类Dev

在不使用yii中的gii工具的情况下为表创建模型视图控制器文件

来自分类Dev

如何在不使用迭代器的情况下在c ++中打印地图

来自分类Dev

如何在不使用迭代器的情况下在c ++中打印地图

来自分类Dev

如何在不创建模型的情况下使用标准Yii2验证器在PHP中验证变量?

来自分类Dev

如何在服务器仍处于活动状态的情况下检查浏览器连接?

来自分类Dev

Matlab中是否有双向地图?

来自分类Dev

如何在URL中没有控制器名称的情况下为单个控制器中的操作方法获取不同的URL?

来自分类Dev

如何在URL中没有控制器名称的情况下为单个控制器中的操作方法获取不同的URL?

来自分类Dev

如何说服借阅检查器允许我缓存值?

来自分类Dev

如何说服借阅检查器允许我缓存值?

来自分类Dev

困惑的借阅检查器消息

来自分类Dev

如何在不使用多个读取器的情况下在SqlDataReader中检查空值

来自分类Dev

如何在没有太多重复的情况下为外部库制作一个薄的 Angular/Typescript 包装器?

来自分类Dev

如何在默认情况下为apt-get和apt启用--verbose-versions?

来自分类Dev

如何在不指定宽度的情况下为div使用“ word-wrap:break-word”

来自分类Dev

如何在光滑的情况下为复杂的案例类创建投影类?

来自分类Dev

Mercurial:如何在不进行变更集的情况下为工作目录创建快照?

Related 相关文章

  1. 1

    如何在不检查null或0的情况下为sqlparameter NULL值分配值?

  2. 2

    如何在不检查null或0的情况下为sqlparameter NULL值分配值?

  3. 3

    Web服务器如何在不安装的情况下为网站查看器工作?

  4. 4

    如何在不使用设置器的情况下为类变量设置值

  5. 5

    如何在没有模型的情况下为@ Html.TextBox()添加验证器

  6. 6

    如何在没有HDMI的情况下为Android Things连接扬声器

  7. 7

    如何在没有构造函数的情况下为“this”赋值

  8. 8

    Cakephp:如何在不创建模型/控制器的情况下获取表数据?

  9. 9

    antlr4:如何在没有生产规则的情况下为令牌生成侦听器回调?

  10. 10

    在MVC 5中如何在没有默认操作的情况下为控制器设置路由?

  11. 11

    如何在没有身份服务器的情况下为NFS的Windows客户端设置身份?

  12. 12

    如何在不使用触发器的情况下为一对多关系设置额外约束

  13. 13

    在不使用yii中的gii工具的情况下为表创建模型视图控制器文件

  14. 14

    如何在不使用迭代器的情况下在c ++中打印地图

  15. 15

    如何在不使用迭代器的情况下在c ++中打印地图

  16. 16

    如何在不创建模型的情况下使用标准Yii2验证器在PHP中验证变量?

  17. 17

    如何在服务器仍处于活动状态的情况下检查浏览器连接?

  18. 18

    Matlab中是否有双向地图?

  19. 19

    如何在URL中没有控制器名称的情况下为单个控制器中的操作方法获取不同的URL?

  20. 20

    如何在URL中没有控制器名称的情况下为单个控制器中的操作方法获取不同的URL?

  21. 21

    如何说服借阅检查器允许我缓存值?

  22. 22

    如何说服借阅检查器允许我缓存值?

  23. 23

    困惑的借阅检查器消息

  24. 24

    如何在不使用多个读取器的情况下在SqlDataReader中检查空值

  25. 25

    如何在没有太多重复的情况下为外部库制作一个薄的 Angular/Typescript 包装器?

  26. 26

    如何在默认情况下为apt-get和apt启用--verbose-versions?

  27. 27

    如何在不指定宽度的情况下为div使用“ word-wrap:break-word”

  28. 28

    如何在光滑的情况下为复杂的案例类创建投影类?

  29. 29

    Mercurial:如何在不进行变更集的情况下为工作目录创建快照?

热门标签

归档