从字符串指针数组中删除一个元素
Posted
技术标签:
【中文标题】从字符串指针数组中删除一个元素【英文标题】:Delete an element from string pointer array 【发布时间】:2021-06-10 01:26:59 【问题描述】:我有一个字符串指针数组 test_array。如果它有一个空字符串,我想走到最后并从数组中找到一个非空元素,将其复制到前一个空元素,最后删除数组的末尾我刚刚复制了。--我将如何使用删除呢? --我需要使用delete还是必须使用delete[]并将整个数组复制到一个新数组中?--delete是否也只删除数组中的指针或字符串?
#include <iostream>
#include <string>
int main()
std::string* test_array = new std::string[5];
int size = 4;
for (int i = 0; i <= size; ++i)//test_array[] 0=a 1=b 2=c 3=d 4=e
test_array[i] = char('a'+i);
test_array[1] = "";//test_array[] 0=a 1=empty 2=c 3=d 4=e
for (int i = 0; i <= size; ++i)
if (test_array[i].empty())
while(test_array[size].empty())//Find last position that isnt empty
delete &test_array[size];//Supposed to delete if empty,probably wrong but the only thing that passed compile
size--;
test_array[i] = test_array[size];
delete &test_array[size];//Supposed to delete if empty
size--;
for (int i = 0; i <= size; ++i)
std::cout<<"String is: "<<test_array[i]<<'\n';
std::cout<<"Deleted element: "<<test_array[4]<<'\n';//Shows deleted e
【问题讨论】:
将std::string* test_array
替换为std::vector <std::string>> test_array
。那么问题就很简单了。
Do i need to use delete or do i have to do delete[] and copy the whole array in a new one?
是的。但顺序相反:复制和删除[]。 Does delete only delete the pointer in the array or the string too?
你的数组不包含指针。什么问题?如果要删除中间的字符串,建议使用std::deque。
你的数组不包含指向string
用new
创建的对象的string*
指针,只有string
用new[]
创建的对象的数组,所以没有需要在任何元素上使用delete
,代码完成后只需要delete[]
数组本身。从元素中移动数据时,只需 clear()
或 move()
该元素即可重置它。
@Jeepsey。为什么必须显式删除该条目?从分配的措辞来看,您需要做的就是跟踪可用的“大小”,而 5 元素数组末尾的任何条目都只是垃圾。这是一个简单的交换问题,并将数组的结束索引减去 1。事实上,普通的旧 std::string test_array[5];
可以正常工作。换句话说,你的老师可能想看看你是否可以模仿 STL std::remove
算法函数,它不会删除任何东西。
不,在这段代码中根本不需要delete[]
数组和new[]
一个新数组。
【参考方案1】:
我有一个字符串指针数组 test_array。
test_array 不是“字符串指针数组”。它是一个指向字符串的指针。它指向动态数组的第一个元素。
从数组中找到一个不为空的元素,将其复制到前一个空的元素中,最后删除我刚刚复制的数组的末尾。
您不能“删除”数组的元素(除非它是指向动态对象/数组的指针,在这种情况下,您正在销毁和释放该元素指向的对象,并且该元素仍保留在数组中)。
数组的大小在 C++ 中不能改变。
所以我必须删除 [] 并新建一个并复制字符串?这是唯一的方法
首先,你可以移动而不是复制。
其次,您应该在删除之前移动,否则没有什么可移动的。
第三,不一定需要更改数组的大小。重新考虑为什么你认为你需要这样做。将这些元素留在最后也可以。
最后,另一种方法是使用std::vector
。我推荐这种方式。
附:您正在做的事情有一个标准算法。它叫std::remove
。
附言如果您不需要保持剩余元素的顺序相同,那么更有效的算法是将最后一个元素移动到“已删除”的元素之上。
【讨论】:
以上是关于从字符串指针数组中删除一个元素的主要内容,如果未能解决你的问题,请参考以下文章
从包含地址字符串元素的指针数组的指针数组中获取字符串元素的地址
访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组