我想将元素i
插入std::vector someVector
但不想使用.insert()
,因为它是O(n)复杂度,因为(据我所知)它推回所有其他元素。
无论如何在恒定时间内这样做,类似于用于擦除的交换/调整大小技巧?
答案 0 :(得分:5)
是的,如果您可以接受对插入或删除位置的顺序访问的限制。
基本思想被称为游标间隙(因为它用于早期文本编辑器)或更常见的间隙缓冲区结构。有一个Wikipedia article about it。但简而言之,您只需保留所有未使用项目的序列或“间隙”,其中您具有插入/删除位置,并且移动插入/删除位置一步对应于将实际项目从一侧复制到另一侧。间隙。
具有连续索引范围的索引仍然是恒定时间,中间有一个间隙(您只需要正确定义它),但是为了然后直接使用向量的缓冲区作为连续数组,差距必须移到一边,这是线性时间操作。