【问题标题】:How can I deallocate the last element of an array in C++?如何在 C++ 中释放数组的最后一个元素?
【发布时间】:2020-11-05 17:47:37
【问题描述】:

我有一个像这样动态分配的数组:a[1,2,3,*unallocated value*],它有 4 个元素。我还有一个length 变量,我可以从中知道它有多长。

我想删除此数组中的最后一个元素并将其设置为未分配或以某种方式取消初始化。

我认为这样的事情可能会起作用a[lenght-1]=*something-something*,但我不知道最后该放什么。有没有办法可以取消分配单个元素?还是我必须创建一个新数组并将除最后一个之外的所有元素复制到其中?

提前致谢。

【问题讨论】:

  • 为什么不使用std::vector?您可以为 4 个整数分配空间,但向量中只有三个,直到您准备好添加第四个元素。举例说明您为何需要此功能可能会为您提供更好的帮助/答案。
  • 我还建议为此使用 std::vector。这将是:std::vector<int> a {1, 2, 3}; 使用三个元素创建它,a.push_back(4) 向其中添加 4a.pop_back() 释放最后一个元素,a.size() 为其当前大小。
  • 如果你想坚持使用数组(我不推荐),我相信你必须创建一个新数组并将除最后一个之外的所有元素复制到其中(这可以忽略不计的性能提升,最好只使用向量或减小大小变量)。
  • @ColonD 这是一个学校练习,我们还没有研究矢量,所以如果我这样做,他们可能不会接受它。但是谢谢你的建议。 :)

标签: c++ arrays integer


【解决方案1】:

回答你的问题:

如何在 C++ 中释放数组的最后一个元素?

  1. 分配一个容量减少的新阵列。
  2. 将除最后一项外的所有项目复制到新创建的数组中。
  3. 删除原始数组。

例子:

int *p_original_array = new int[5];
int *p_shorter_array  = new int[4];
//...
std::copy(p_original_array, p_original_array + 4, p_shorter_array);
delete [] p_original_array;

【讨论】:

    【解决方案2】:

    您要查找的*something-something* 称为sentinel

    例如,如果您的数组只能包含正整数,您可以使用值0 来指示“空”槽。或-1

    但是,如果允许 ANY 整数值,这将不起作用。

    另一方面 - 为什么您需要在该插槽中放置任何值?您可以简单地依靠您的 length 变量来确定该元素是否有效。

    【讨论】:

      【解决方案3】:

      首先,您始终可以将某些内容设置为 NULL 指针。但我认为对于您的用例,vector 是您想要使用的。 Vector 使用数组作为数据结构,但您可以在最后添加/删除元素。 (如果向量填充是数组,它将创建一个更大的数组并复制所有内容,因此无需担心长度)

      【讨论】:

      • 首先,您总是可以将某些内容设置为 NULL 指针 不,您不能。只有指针可以设置为NULL
      【解决方案4】:

      目前尚不清楚您是否只想通过 end 删除元素,或者它是否可以发生在任何位置。

      在第一种情况下,您可以使用长度变量来存储“使用的长度”,并使用另一个变量(可能名为“容量”)来存储数组的实际容量。第一个永远不会大于第二个,但它可能会更小。这是一个非常简单的解决方案:如果您将大小设置为 3,则索引 3 将不再可用,您无事可做。

      在第二种情况下,我建议使用@Vlad Feinstein 的回答中描述的哨兵策略。

      【讨论】:

        【解决方案5】:

        由于您有一个length 指示数组中有效 元素的数量,因此无需将值复制到新数组。只需减少length。根据数组中使用的数据类型,重置最后一个元素的值可能有意义,也可能没有意义。

        例如,重置一个整数根本没有意义,但如果你愿意,你可以这样做,例如:

        a[--lenght] = 0;
        

        但是,重置std::string 以释放它可能在内部使用的任何动态内存确实有意义,例如:

        a[--lenght] = "";
        
        a[--lenght] = string();
        
        --lenght;
        a[lenght].clear();
        a[length].shrink_to_fit(); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          相关资源
          最近更新 更多