将阵列向右移动

时间:2016-11-22 03:14:55

标签: c++ arrays

我生成一个随机整数数组,并尝试将值向右移动,并用前一个最后一个元素替换第一个元素。

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

#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个。

2 个答案:

答案 0 :(得分:1)

以下是有问题的代码:

        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 }

答案 1 :(得分:0)

你试过吗

  

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

     

std :: rotate(&amp; arr [0],&amp; arr 1,&amp; arr [10]); ......会做的。你&#39; 11   需要#include算法标题。

Optimal way to perform a shift operation on an array

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

#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