删除数组的特定元素

时间:2015-01-17 23:59:26

标签: c++ arrays

我偶然发现了一些奇怪的解决方案,它允许删除数组的特定元素(静态数组)。

有些人可以向我解释它是如何运作的,因为提供给一个例子的解释对我来说并不清楚。

这是代码。假设我们有一个名为 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;数组中的一个位置,从而删除所需的条目。

我确实尝试在简单的程序上实现它,但我无法使其工作,有人可以为我解释这个特定的方法吗?

5 个答案:

答案 0 :(得分:0)

循环将每个元素在被“删除”之后复制到它之前的位置(即从位置jj-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];

想象一下thisEntry15currentSize20

然后你的循环就是:

       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;,因为它现在位于不使用的数组部分。净总体效果是,使用部分中的数据比以前小一些,并且删除的元素已经消失,但所有其他元素都存在。