将数组向右移动

新手上路,请多包涵

我正在生成一个随机整数数组并尝试将值向右移动一个并将第一个元素替换为前一个元素。

输出是无序的,最后的元素是一个随机生成的整数。

 #include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;

   void shift(int values[], int size) {
    int temp;
    for (int i = 0; i < size; i++) {
        temp = values[size - 1];
        values[i] = values[i + 1];
        values[0] = temp;
        cout << values[i] << setw(4);
    }
    cout << endl;
}
int main()
{
    cout << "Random 10 index array" << endl;
    const int CAP = 10;
    int numbers[CAP];

    srand(time(0));
    int i;
    for (i = 0; i < CAP; i++) {
        int rng = rand() % 100 + 1;
        numbers[i] = rng;
        cout << numbers[i] << setw(4);

    }
    cout << "shifting all elements to the right: " << endl;
shift(numbers, CAP);

    cout << endl;
    system("pause");
    return 0;
}

我尝试使用 i < size - 1 ,但我需要的 10 个数字中有 9 个。

原文由 Ozymandias 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 237
2 个回答

这是有问题的代码:

         temp = values[size - 1];

该语句不使用循环变量。为什么它坐在循环中?此分配将继续发生 size-1 次。

         values[i] = values[i + 1];

您的循环不变量是 i <size ,但您尝试访问 i+1 。那只是自找麻烦:)。这就是为什么您在使用 i < size-1 时不会得到垃圾值的原因。

         values[0] = temp;

同样,这不使用循环变量。它不属于循环。您只需一遍又一遍地设置 values[0]

这是一个有效的解决方案,使用两个临时变量:

 void shift(int values[], int size) {
  7     int temp = values[size-1], temp1;
  8     for (int i = 0; i < size; i++) {
  9         temp1 = values[i];
 10         values[i] = temp;
 11         temp = temp1;
 12         cout << values[i] << setw(4);
 13     }
 14     cout << endl;
 15 }

原文由 aspen100 发布,翻译遵循 CC BY-SA 3.0 许可协议

你有没有尝试过

如果您想要元素的循环移位:

std::rotate(&arr[0], &arr 1 , &arr[10]); ……会成功的。您需要#include 算法标头。

对数组执行移位操作的最佳方法

编辑:正如所指出的,如果直接使用,std::rotate 会向左旋转。 是一个在向量上进行右旋转的示例,并进行了一些更改:

 #include <vector>
#include <iostream>
#include <algorithm>

int main()
{
    std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1};

    // simple rotation to the right
    std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());

    std::cout << "simple rotate right : ";
    for (int n: v)
        std::cout << n << ' ';
    std::cout << '\n';

}

输出:

 simple rotate right : 1 2 4 2 0 5 10 7 3 7

原文由 maz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题