V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
canxden
V2EX  ›  问与答

可能互相循环引用数据应该设计什么样的数据结构

  •  
  •   canxden · 2021-12-31 14:22:07 +08:00 · 1061 次点击
    这是一个创建于 1040 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 A 场景 中有事件: a 事件 b 事件 c 事件 的事件数组

    然后 a 事件 中有场景: A 场景 B 场景 C 场景 的场景数组

    然后又有 b 事件 需要依赖 a 事件

    a 事件被删除了, b 事件也应该要同时被移除.

    想了很多种方式, 感觉都需要全量更新, 然后效率也会很慢

    4 条回复    2022-01-06 09:37:53 +08:00
    Chad0000
        1
    Chad0000  
       2021-12-31 14:36:29 +08:00 via iPhone   ❤️ 1
    没做过这样的,如果一个事件关联其他的并不是很多,是不是可以考虑事件双方相互保存 ID ,然后通过队列同步操作,比如一方删除另一方通过消息队列同步删。
    kilasuelika
        2
    kilasuelika  
       2022-01-02 11:42:38 +08:00 via Android
    C++里面的 weak_ptr 是用来解决循环引用传递的。大概是这样的,类外部存储两个事件的 shared_ptr 指针。类内用 weak_ptr 指向这两个事件(用它们的 shared_ptr 指针初始化 weak_ptr )。这个 weak_ptr 不修改引用计数。

    但跟你说的这个还有区别,shared_ptr 是根据生命周期自动管理内存的。

    针对你的情形,我设想用类似于注册的机制。用一个集中的控制中心,事件创建打表标记哪些事件应该绑定在一起。然后事件消失时,由这个控制中心来根据表注销绑定的事件。
    sillydaddy
        3
    sillydaddy  
       2022-01-02 15:29:52 +08:00
    考虑效率的话,可以用观察者模式:
    「 A 事件」删除时,会对外广播消息,而「 B 事件」注册观察「 A 事件」的消息,然后作相应的处理。这样的话,只有注册(观察)的会被影响。效率比较高。而且观察者模式是一个很常用的去耦合的模式:A 只管广播消息,不用关心谁接收。

    类似的,场景之间的依赖也可以这样。
    canxden
        4
    canxden  
    OP
       2022-01-06 09:37:53 +08:00
    @sillydaddy 现在纠结的点, 不是实现这样的机制, 而是这样的机制, 用什么样的数据结构去存储这种结构. 就是想要持久化这种循环引用的关系, 需要用什么样的数据结构.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:32 · PVG 08:32 · LAX 16:32 · JFK 19:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.