【问题标题】:Delete parts of a dynamic array and grow other删除动态数组的一部分并增加其他的
【发布时间】:2010-09-28 08:50:07
【问题描述】:

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

int * p = new int[6];

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

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];

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

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

使用指针,在一般情况下,我会指向任何非连续内存区域的开始,我会考虑它存储了多少元素。从概念上讲,我会将大数组分成许多小数组,而不必在内存中的连续空间中(删除会产生“漏洞”,而分配不一定会“填充”它们)。

【问题讨论】:

  • 从现在开始,每当您使用关键字delete 时,您都应该认真考虑自己做错了什么。 :) 正确的方法是将资源包装成可以为您管理的东西。这是 SBRM (RAII)。

标签: c++ pointers


【解决方案1】:

您可以使用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]

真的,任何时候你想使用动态分配的数组,你应该首先考虑使用std::vector。它不是所有问题的解决方案,但与其他 C++ 标准库容器一起,它绝对是大多数问题的解决方案。

【讨论】:

  • 假设k_1要插入的元素数,k_2要删除的元素数和n向量中的元素总数k_1k_2 n。 vector 的解决方案不采用O(n) 而不是O(k_1 + k_2)
  • @myle:从vector 中间移除所花费的时间与向量中在被移除元素范围之后的元素数量成正比。在中间插入可能需要与向量中元素总数成比例的时间(如果需要重新分配)。由于数组是连续存储的,所以没有办法解决这个问题。您需要使用另一种数据结构(如链表)来获得不同的性能特征(但请注意,在大多数实际应用程序中,链表并不是数据结构的最佳选择)。
  • 如果我可以避免内存碎片(我可以),如果指向数组不同“部分”的不同指针(如示例中所示)和new 正在分配内存可以这样做,那么我会有更好的性能,即O(k_1 + k_2)。我坚持这一点,因为这对我的实施非常重要。
  • @myle:不,list 不支持随机访问,因为链表中的随机访问很慢。您提议的数据结构中的随机访问(实际上是一个锯齿状数组)也将相对低效(与数组中的访问相比)。
  • @myle:当然,如果您的问题仍未解决,请针对您要解决的具体问题提出另一个问题(“我需要一个支持有效随机访问的容器和 O (k) 插入和移除”或类似的东西。
【解决方案2】:

您应该查看 C++ 中的 STL 容器,例如 vector 具有您想要的功能。

【讨论】:

    【解决方案3】:

    我建议您不要自己这样做。查找std::vector 以获得合理的起点。

    【讨论】:

      【解决方案4】:

      另一个选项,除了std::vectorstd::deque,它的工作方式大致相同,但在将块插入中间时效率更高。如果这对您来说仍然不够好,您可能会使用集合的集合获得一些里程。您必须做更多的工作才能随机访问工作(也许编写一个类来包装整个事情。

      【讨论】:

      • 在批量插入/删除的情况下,最多出现 n/2 个副本,而对于向量,可能会出现 n 个副本。加速不是主要的,但它是值得的。
      • 另一方面,插入时的加速是以随机访问类似的恒定因子减速为代价的。 TANFL
      猜你喜欢
      • 2011-12-06
      • 2014-09-02
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多