我偶然发现了一些奇怪的解决方案,它允许删除数组的特定元素(静态数组)。
有些人可以向我解释它是如何运作的,因为提供给一个例子的解释对我来说并不清楚。
这是代码。假设我们有一个名为 entryList 的数组,我们想要删除名为FindName的函数专门指向的元素。
void Directory::Remove()
{
char aName[20];
cout << "Type name to be removed";
cin.getline(aName, 20);
int thisEntry = FindName(aName);
if (thisEntry == -1)
cout << aName << " not found in directory";
else
{
/*** The bit that I don't understand ***/
for (int j = thisEntry + 1; j < currentSize; j++)
entryList[j - 1] = entryList[j];
currentSize--;
cout << "Entry removed.\n";
}
}
解释说这个&#39;算法&#39; 将移动每个成功元素&#34; down&#34;数组中的一个位置,从而删除所需的条目。
我确实尝试在简单的程序上实现它,但我无法使其工作,有人可以为我解释这个特定的方法吗?
答案 0 :(得分:0)
循环将每个元素在被“删除”之后复制到它之前的位置(即从位置j
到j-1
)。
答案 1 :(得分:0)
FindName
返回索引。如果有一个带有文本的元素(aName
),则返回其索引,否则返回-1。因此for循环复制找到的项目前面的每个元素,向后复制一个块。因此,例如位置5处的项目将转到4.使用此算法,将覆盖找到的项目。这是插图:
首先是项目:
[0]狮子
[1]大象
[2]企鹅
现在我们要删除狮子。 FindName
返回0,因为它的索引是0.所以大象变为0,企鹅变为1。
答案 2 :(得分:0)
程序将搜索提供的名称并返回所提供名称所在的位置(例如文件中的行)。该位置存储在thisEntry变量中。然后它将通过为该点分配下一个名称来删除该行,并为该行的其余currentSize - thisEntry元素分配所有名称。最后,它减少了currentSize,因为只删除了一个条目。我希望它有所帮助。
答案 3 :(得分:0)
在脑海中展开循环。
/*** The bit that I don't understand ***/
for (int j = thisEntry + 1; j < currentSize; j++)
entryList[j - 1] = entryList[j];
想象一下thisEntry
是15
。 currentSize
是20
。
然后你的循环就是:
entryList[15] = entryList[16]; // Copy entry 16 to entry 15
entryList[16] = entryList[17]; // Copy entry 17 to entry 16
entryList[17] = entryList[18]; // Copy entry 18 to entry 17
entryList[18] = entryList[19]; // Copy entry 19 to entry 18
答案 4 :(得分:0)
要记住的重要一点是C / C ++中的数组是固定大小的 - 在创建数组后不能更改数组的大小。你可以做的是改变数组元素的使用方式。
在您的示例中,您有一个数组entryList
和一个变量currentSize
,用于跟踪当前使用的数据量。这是不实际数组的大小 - 它的某些数字小于(或等于)跟踪数组中包含有意义数据的元素数量的数组的大小。此后的元素可能存在,但不会使用它们的内容。
因此,当你从数组中删除一个元素时,实际上并没有将它从数组中删除,而是用下一个元素替换它(覆盖它),并对所有后续元素执行相同的操作,移动它们所有在阵列中的一个空间 - 所以&#39;最后&#39;数组中有意义的元素是重复的。然后递减currentSize
,使重复的最后一个元素&#34;消失&#34;,因为它现在位于不使用的数组部分。净总体效果是,使用部分中的数据比以前小一些,并且删除的元素已经消失,但所有其他元素都存在。