如何在 C++ 中释放数组的最后一个元素?
How can I deallocate the last element of an array in C++?
我有一个这样的动态分配数组:a[1,2,3,*unallocated value*]
有 4 个元素。我还有一个 length
变量,从中我知道它有多长。
我想删除此数组中的最后一个元素并将其设置为未分配或以某种方式取消初始化。
我认为这样的事情可能行得通 a[lenght-1]=*something-something*
但我不知道最后放什么。有没有办法取消分配单个元素?或者我是否必须创建一个新数组并将除最后一个元素之外的所有元素复制到其中?
提前致谢。
首先,您始终可以将某些内容设置为 NULL 指针。但我认为对于您的用例,您想要使用 vector 。 Vector 使用数组作为数据结构,但最后可以 add/remove 个元素。 (如果向量填充数组,它将创建一个更大的数组并复制所有内容,因此无需担心长度)
您要找的*something-something*
叫sentinel
。
例如,如果您的数组只能包含正整数,您可以使用值 0
来指示“空”槽。或者 -1
.
但是,如果允许 任何 整数值,这将不起作用。
另一方面 - 为什么您需要在该插槽中放置任何值?您可以简单地依靠 length
变量来确定该元素是否有效。
回答你的问题:
How can I deallocate the last element of an array in C++?
- 分配一个容量少一的新数组。
- 将除最后一个项目之外的所有项目复制到新创建的数组。
- 删除原数组。
示例:
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;
尚不清楚您是否只想按结尾删除元素,或者它是否可以在任何位置发生。
在第一种情况下,您可以使用长度变量来存储“已用长度”,并使用另一个变量(可能命名为“容量”)来存储数组的实际容量。第一个永远不会大于第二个,但它可以更小。这是一个非常简单的解决方案:如果您将大小设置为 3,则索引 3 不再可用,您无事可做。
在第二种情况下,我建议使用@Vlad Feinstein 的回答中描述的哨兵策略。
由于您有一个 length
指示数组中 有效 元素的数量,因此无需将值复制到新数组。简单地减少 length
。根据数组中使用的数据类型,重置最后一个元素的值可能有意义也可能没有意义。
例如,重置一个整数根本没有意义,但如果你愿意,你可以这样做,例如:
a[--lenght] = 0;
但是,重置 std::string
以释放它可能在内部使用的任何动态内存确实有意义,例如:
a[--lenght] = "";
a[--lenght] = string();
--lenght;
a[lenght].clear();
a[length].shrink_to_fit();
我有一个这样的动态分配数组:a[1,2,3,*unallocated value*]
有 4 个元素。我还有一个 length
变量,从中我知道它有多长。
我想删除此数组中的最后一个元素并将其设置为未分配或以某种方式取消初始化。
我认为这样的事情可能行得通 a[lenght-1]=*something-something*
但我不知道最后放什么。有没有办法取消分配单个元素?或者我是否必须创建一个新数组并将除最后一个元素之外的所有元素复制到其中?
提前致谢。
首先,您始终可以将某些内容设置为 NULL 指针。但我认为对于您的用例,您想要使用 vector 。 Vector 使用数组作为数据结构,但最后可以 add/remove 个元素。 (如果向量填充数组,它将创建一个更大的数组并复制所有内容,因此无需担心长度)
您要找的*something-something*
叫sentinel
。
例如,如果您的数组只能包含正整数,您可以使用值 0
来指示“空”槽。或者 -1
.
但是,如果允许 任何 整数值,这将不起作用。
另一方面 - 为什么您需要在该插槽中放置任何值?您可以简单地依靠 length
变量来确定该元素是否有效。
回答你的问题:
How can I deallocate the last element of an array in C++?
- 分配一个容量少一的新数组。
- 将除最后一个项目之外的所有项目复制到新创建的数组。
- 删除原数组。
示例:
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;
尚不清楚您是否只想按结尾删除元素,或者它是否可以在任何位置发生。
在第一种情况下,您可以使用长度变量来存储“已用长度”,并使用另一个变量(可能命名为“容量”)来存储数组的实际容量。第一个永远不会大于第二个,但它可以更小。这是一个非常简单的解决方案:如果您将大小设置为 3,则索引 3 不再可用,您无事可做。
在第二种情况下,我建议使用@Vlad Feinstein 的回答中描述的哨兵策略。
由于您有一个 length
指示数组中 有效 元素的数量,因此无需将值复制到新数组。简单地减少 length
。根据数组中使用的数据类型,重置最后一个元素的值可能有意义也可能没有意义。
例如,重置一个整数根本没有意义,但如果你愿意,你可以这样做,例如:
a[--lenght] = 0;
但是,重置 std::string
以释放它可能在内部使用的任何动态内存确实有意义,例如:
a[--lenght] = "";
a[--lenght] = string();
--lenght;
a[lenght].clear();
a[length].shrink_to_fit();