Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何跟踪列表的更改_C++_Algorithm_List_Dictionary_Vector - Fatal编程技术网

C++ 如何跟踪列表的更改

C++ 如何跟踪列表的更改,c++,algorithm,list,dictionary,vector,C++,Algorithm,List,Dictionary,Vector,我有一个不可变的基本项目列表,我想对这些项目执行一系列操作:编辑、添加、删除、读取。实际操作将排队并在其他位置执行(向上发送到服务器,向下发送一个新列表),但我需要一个列表的表示形式,该列表与应用于基本列表的当前操作集是什么样的 我当前的实现保留了一个范围向量以及它们映射到的位置。因此,未编辑列表有一个范围,从0到长度,直接映射到基本列表。如果在索引5中执行添加,那么我们有3个范围:0-4映射到基本列表0-4。5映射到新项目,6-(长度+1)映射到5长度。但是,如果进行大量的添加和删除,读取将降

我有一个不可变的基本项目列表,我想对这些项目执行一系列操作:编辑、添加、删除、读取。实际操作将排队并在其他位置执行(向上发送到服务器,向下发送一个新列表),但我需要一个列表的表示形式,该列表与应用于基本列表的当前操作集是什么样的

我当前的实现保留了一个范围向量以及它们映射到的位置。因此,未编辑列表有一个范围,从0到长度,直接映射到基本列表。如果在索引5中执行添加,那么我们有3个范围:0-4映射到基本列表0-4。5映射到新项目,6-(长度+1)映射到5长度。但是,如果进行大量的添加和删除,读取将降级为O(n)


我曾想过使用hashmaps,但插入和删除时可能出现的范围变化带来了挑战。是否有某种方法可以实现这一点,从而使读取仍然在O(1)左右?

如果您有一个大致平衡的范围树,其中每个节点在树中保留其下元素总数的记录,那么您可以在最坏情况下回答读取树的深度,这应该是log(n)。也许a将是更容易实现的平衡树之一


如果您有大量重复读取和少量修改,那么您可以保留自上次修改以来读取结果的哈希图,修改时清除它。

如果原始列表不可变,您打算如何执行添加?在添加计算虚拟结果列表所需的操作时,您将无法避免性能下降。我对尽可能提高效率的解决方案很感兴趣,因为我有一个类似的非破坏性编辑问题。这些更改将应用到服务器上,我们稍后将获得更新版本。那么为什么不只存储索引列表而不是范围呢?这是我考虑过的一种可能性,但是需要一个完整的O(n)每次都有内存空间。如果列表中有上万个项目,并且每一帧都会更新,那么这可能会很昂贵。