【发布时间】:2017-05-27 11:21:18
【问题描述】:
只是一些想法:
我想从大小为 n > x 的 std::vector 的开头擦除 x 个元素。由于向量在内部使用数组,这可以像将 vector.begin() 的指针设置为保留的第一个元素的索引一样简单。但是,erase 会将数组中的所有元素移动到第一个元素实际上从索引 0 开始,这使得擦除操作花费的时间比它可能花费的时间要长。
此外,如果内部数组的有效“区域”实际上仅由向量结构的一些开始和结束索引/指针控制,那么还可以选择在第一个元素前面保留空间。例如,初始化一个向量,最后保留 20 个空格,开头保留 10 个空格。在内部,然后创建一个空间为 30(或 32)的数组,其中起始索引/指针指向内部数组的第 11 个值,允许以恒定速度将新元素包含到“向量”的前面。
嗯,我的意思是,我认为这样的数据结构会有些用处,至少对我的目的而言。我很确定有人已经想到了这一点并且已经实现了它。所以我想问:我所描述的数据结构是怎么命名的?如果它存在,我很乐意使用它。我认为这不是一个双链表,因为在那里,每个元素都是一种结构,其中包含元素值和指向邻居的附加指针(据我所知)。
编辑:是的,这样的结构可能会使用比必要更多的内存,尤其是在从头开始擦除某些元素时,因为那时内部数组仍然具有初始大小。但是,对于大多数问题来说,内存不再是一个大问题,并且可能有一个(耗时的)“内存优化”操作来创建一个新的、更小的数组,复制所有旧值并删除旧的内部数组使用尽可能小的尺寸。
【问题讨论】:
-
这不是
std::deque,但我认为这是标准库中最接近的。 -
std::vector并没有真正“在内部使用数组”。它通过std::allocate分配,它使用placement new 来保留内存。它不(也不能)使用new[]。 -
有什么理由不能使用 std::vector<:shared_ptr> ?这将允许您将 null 项保留在前面。
-
听起来 Boost 的动态环形缓冲区之一的工作方式与您描述的一样:它们可以在不移动现有数据的情况下在两端插入和擦除,当缓冲区已满时,可以重新分配。
-
@kushy 除非您使用新的展示位置,否则不会 - 但这可能不值得努力。
标签: c++ arrays vector data-structures