如何跳过数组中的索引C ++

时间:2016-03-31 18:30:41

标签: c++ arrays loops indexing skip

我正在尝试编写一个循环遍历数组的函数,并跳过给定的索引。例如。 如果有数组:

    int Array[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

我希望输出跳过给定的索引。例如索引5,将跳过" 4"。并通过跳过" 4"或索引5来输出较小尺寸的数组。

   0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19

我跳过索引的当前函数如下所示:

   void deleteArray(int original[], int origLen, int newArray[], int index){

    for(int i = 0; i < origLen--; i++){

      newArray[i] = original[i];

      if(original[i] == index){

        newArray[i] = original[i-1];

    }

}

}

我试图遍历原始数组并复制其索引,直到它到达某个索引,然后跳过该给定索引,并创建一个新数组。基本上,将所有数组项移到左边,同时跳过从原始数组复制的新数组中的给定索引。

但是,在我的if语句中,我不确定如何跳过索引。我当前的代码用前一个索引替换索引。输出:

  0, 1, 2, 3, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19

期望的输出:

    0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19

5 个答案:

答案 0 :(得分:1)

首先,您的情况不正确:

  if(original[i] == index){

您要将元素的值与所需的索引进行比较,而不是将索引本身(在本例中应为i)进行比较。

一旦超过了所需的索引,你实际上希望新数组中的每个元素与原始数组中的前一个元素相同 - 而不仅仅是一个 - 所以你需要以某种方式处理它。我建议您保留一个布尔标记来跟踪您是否已超过索引,在这种情况下,将original[i-1]分配给newArray[i];如果该标志为false,则代之以original[i] newArray[i](正如您已经做过的那样)。

答案 1 :(得分:1)

您可以使用两个循环而不是使用一个循环来简化函数,并对循环的每次运行执行检查。

void deleteArray(int original[], int origLen, int newArray[], int index){

    // Get everything up to index.
    // When index is 5, get everything until i = 3
    for(int i = 0; i < index-1; i++) {
      newArray[i] = original[i];
    }

    // Now get everything after index.
    for(int i = index; i < origLen; i++) {
      newArray[i-1] = original[i];
    }    
}

答案 2 :(得分:1)

std :: copy it:

auto newArrayPosition = std::copy(original, original + index, newArray);
std::copy(original + index + 1, original + origLen, newArrayPosition);

答案 3 :(得分:1)

如果你总是知道你的新阵列会比原来的小一个元素,我建议你这样做:

int Array[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int newArray[19];

然后

void deleteArray(int original[], int origLen, int newArray[], int index){
j = 0;
for(int i = 0; i < origLen; i++){
  if(i == index){
    continue;
  }
  newArray[j] = Array[i];
  j++;
}

甚至你可以像这样写你的循环文章(如果你不想使用j):

for(int i = 0; i < origLen; i++){
  if(i == index){
    continue;
  }
  if (i < index){
    newArray[i] = Array[i];
  }
  else {
    newArray[i-1] = Array[i];
  }
}

答案 4 :(得分:0)

我会保留两个计数器,一个用于插入位置,另一个用于读取位置:

void deleteArray(int original[], int origLen, int newArray[], int index){
    int insertPos = 0;
    for(int readPos = 0; readPos < origLen; readPos++){

        // If this position is equal to the index we want to skip
        if (readPos == index)
        {
            // continue onto next loop iteration
            continue;
        }
        // Copy over the data
        newArray[insertPos] = original[readPos];
        // increment the counter
        insertPos++;
    }
}

就像其他人所说的那样,避免i < origLen--,因为这非常复杂,实际上你甚至都没有解析整个数组,因为你一直在减少。