数组移位到下一个元素

6

如何将数组中的元素移动到下一个元素

eg: x[5] = { 5, 4, 3, 2, 1 }; // initial values
    x[0] = 6; // new values to be shifted
    x[5] = { 6, 5, 4, 3, 2 }; // shifted array, it need to be shifted, 
                              // not just increment the values.

这是我目前所做的。它是错误的,所以我需要在这里寻求帮助。提前感谢。

#include <iostream>

using namespace std;

int main() 
{
  int x[5] = { 5, 4, 3, 2, 1 };

  int array_size = sizeof(x) / sizeof(x[0]);

  x[0] = 6;

  int m = 1;

  for(int j = 0; j < array_size; j++) {
    x[m+j] = x[j];
    cout << x[j] << endl;
  }

  return 0;
}

从数组的末尾索引开始复制数组,而不是从开头开始,因为当您从开头开始复制元素时,您将会丢失下一个元素。因此,请更改for循环。 - Anil Vishnoi
请注意“off by one”:x[m+j] = x[j]; 将尝试覆盖索引为“array_size”的元素,而该索引超出了数组范围 - 这是未定义的行为。 - sharptooth
7个回答

14
#include<algorithm>

// ...
std::rotate(x, x+4, x+5);
x[0] = 6;

抱歉,我不想使用算法。 - Azam

8
要“向右移动”,您需要从数组的末尾开始迭代:
for(int j = array_size - 2; j >= 0; j--) {
   x[m+j] = x[j];
   cout << x[j] << endl;
}   

否则你会将所有元素都覆盖为第0个元素。 请注意array_size - 2,否则您尝试访问数组末尾之外的元素时将出现“偏移一位”错误,并且这是未定义的行为。

1
@azam:我只是指出了你代码中的主要问题。你仍然需要自己将值放入[0]元素中,并且你还需要再次迭代数组以获取输出。 - sharptooth

8
#include <iostream>

int main () {

  int x[5] = { 5, 4, 3, 2, 1 };

  int array_size = sizeof (x) / sizeof (x[0]);

  for (int j = array_size - 1; j > 0; j--) {

      x[j] = x[j - 1];
  }

  x[0] = 6;

  for (int j = 0; j < array_size; j++) {

      std::cout << x[j];
  }

  return 0;
}

这样做是否有意冒着产生分段错误的风险? - kjh

4

首先,你应该在写入新值之前将数组中的旧值移位。但是,不要使用循环,最好使用memmove()。或者更好的是,使用std::vector代替数组——它可以为您处理所有这些低级问题,包括在需要时自动调整数组大小。


但我猜这是作业,所以我想需要循环和索引操作。 - Cedric H.

1

在一般情况下,当你需要移动m个元素(其中0 <= m <n)时:从数组的末尾开始。如果你从开头(索引0)开始,那么你会覆盖并移动被覆盖的值。

研究std::memmove的源代码也可能是有益的。


我认为这个解决方案和使用旋转的解决方案比使用for循环的更好。使用库例程总是比编写自己的代码更好。 - Sahil Singh

0

你可以从数组的末尾开始。你将复制:

  • 倒数第二个位置的元素到最后一个位置,
  • 倒数第三个位置的元素到倒数第二个位置,
  • ...
  • 第一个位置(索引0)的元素到第二个位置,最后
  • 复制新数字到第一个位置。

.

for(j = array_size-1; j >0; j--) {
 x[j] = x[j-1];
}
x[0] = 6;

0
    #include <iostream>

    using namespace std;

    int main() 
    {
       int x[5] = { 5, 4, 3, 2, 1 };

        int array_size = sizeof(x) / sizeof(x[0]);

        int m = 1;

        for(int j = array_size-1; j > 0; j--) {
           x[j] = x[j-m];
           cout << x[j] << endl;
        }

       x[0] = 6;
       return 0;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接