删除动态数组的部分并增长其他部分

Dim*_*eas 2 c++ pointers

我需要一个动态数组,所以我需要通过指针分配必要的内存量.是什么让我想知道哪个是一个好的解决方案,是C++有能力做类似的事情:

int * p = new int[6];
Run Code Online (Sandbox Code Playgroud)

它分配必要的数组.我需要的是,之后,我想增长这个数组的一些部分.一个(有缺陷的)例子:

int *p1 = &p[0];
int *p2 = &p[2];
int *p3 = &p[4];
// delete positions p[2], p[3]
delete [] p2;
// create new array
p2 = new int[4];
Run Code Online (Sandbox Code Playgroud)

我不知道如何实现这种行为.

编辑:std::vector对我不起作用,因为我需要插入/删除k元素的时间与数字成比例k而不是存储在元素中的元素数量std::vector.

使用指针,在一般情况下,我会指出任何非连续的内存区域的开始,我会记录它存储的元素数量.从概念上讲,我会将大数组分成许多小数组,而不一定在内存中的连续空间中(删除会创建"空洞",而分配不一定"填充"它们).

Jam*_*lis 8

您可以使用std::vector以下方法实现此行为

std::vector<int> v(6);         // create a vector with six elements.
v.erase(v.begin() + 2);        // erase the element at v[2]
v.insert(v.begin() + 2, 4, 0); // insert four new elements starting at v[2]
Run Code Online (Sandbox Code Playgroud)

实际上,只要您想使用动态分配的数组,就应该首先考虑使用std::vector.它不是每个问题的解决方案,但与其他C++标准库容器一起,它绝对是大多数问题的解决方案.

  • @myle:当然,如果你的问题仍然没有解决,请问你正在尝试解决的具体问题另一个问题("我需要一个支持高效随机访问和O(k)插入和删除的容器"或类似的东西). (3认同)
  • @myle:从`vector`中间删除需要的时间与向量中要删除的元素范围之后的元素数量成比例.中间的插入可能需要与向量中的元素总数成比例的时间(如果需要重新分配).由于数组是连续存储的,因此无法解决这个问题.您需要使用其他数据结构(如链接列表)来获得不同的性能特征(但请注意,在大多数实际应用程序中,链接列表不是数据结构的最佳选择). (2认同)