2013-03-27 92 views
1

我想实现一个“TreeView”作为一棵树到列表的视觉映射,列表中的缩进由映射节点的深度提供。我的具体问题是一层2级深的树,第一层有100 000个节点,每个节点包含20个节点(即100 000个文件夹,每个文件夹包含20个文件)。目前,我保持一个std::map,这对于一个完全展开树(2 000 000中的“树视图”潜在可见项)看起来像这样从树的映射:treeview的数据结构

key value 
0 pointer to parent node 0 
20 pointer to parent node 1 
40 pointer to parent node 2 
... 

这意味着列表项[0,19 ]由父节点0,[20,39]覆盖父节点1,...如果余崩溃节点0,映射需要更新:

key value 
0 pointer to parent node 0 
1 pointer to parent node 1 
21 pointer to parent node 2 
... 

在此,列表项0由父覆盖节点0,由父节点1列出项目[1,20] ......这意味着当折叠节点0时需要更新std::map中的99000个值的密钥。这意味着99000个删除和插入到地图中,否则密钥不能被更新。什么数据结构和/或容器将允许我用更少的努力更新映射树 - >列表?

+0

通常几十万行是不可见的一次。 AFAIK的实现通常不一定会将数据一次保存到内存中的所有节点,而是根据需要获取它们,使它们不必插入,移除或任何90.000个节点都不会注意到,因为它们不是目前可见。 – mikyra 2013-03-27 07:54:29

+0

无论如何,100k的更新无论如何都会影响你的应用程序,这是无可避免的,但是除非你真的需要排序,否则你可以开始转向'std :: unordered_map',这会让事情快一个数量级。 – TC1 2013-03-27 07:57:48

+0

@mikyra确实如此,但我仍然需要知道,如果有人滚动到任意位置,那里显示的内容,即要加载哪些节点。 – user1095108 2013-03-27 07:57:56

回答