可能互相循环引用数据应该设计什么样的数据结构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
canxden
V2EX    问与答

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

  •  
  •   canxden 2021 年 12 月 31 日 1555 次点击
    这是一个创建于 1485 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

    类似的,场景之间的依赖也可以这样。
    canxden
        4
    canxden  
    OP
       2022 年 1 月 6 日
    @sillydaddy 现在纠结的点, 不是实现这样的机制, 而是这样的机制, 用什么样的数据结构去存储这种结构. 就是想要持久化这种循环引用的关系, 需要用什么样的数据结构.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     891 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 22:04 PVG 06:04 LAX 14:04 JFK 17:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86