我有一个C ++程序,我必须根据给定要旋转的元素数(x)顺时针旋转数组。例如,如果输入数组是
[1,2,3,4,5]
假定必须旋转2个元素(表示为x)。
输出数组应该是
[3,4,5,1,2]
代码:
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
int a[n],b[x];
for(int i=0;i<n;i++){
cin>>a[i];
}
copy(a,a+x,b);
copy(b,b+x,a+n);
n=n+x;
for(int i=x;i<n;i++){
cout<<a[i]<<" ";
}
}
return 0;
}
我在这里所做的是将给定数量的元素复制到新数组中。以后将它们复制回从'n'开始的原始数组。所以我的数组看起来像[1,2,3,4,5,1,2]。
稍后我将从索引'x'开始打印出数组。这样我的数组将看起来像[3,4,5,1,2]。
我能够编译程序,并且得到输出。但是,当在名为GeekforGeeks的网站中提交代码时,其编译器抛出了Segmentation Fault(SIGSEGV)。
此
int a[n],b[x];
不是标准的c ++。有关详细信息,请参见此处:Why aren't variable-length arrays part of the C++ standard?。将std::vector
用于动态数组。
然后在这里:
copy(a,a+x,b);
您使用x
,但是用于a
的尺寸是n
而不是x
。根据您的输入,这可能会超出阵列的边界。
下一个,这里:
copy(b,b+x,a+n);
您尝试复制到a+n
,但是a+n
已经超出a
的最后一个元素。数组的大小固定,n=n+x;
也无济于事。
要旋转数组(或std::vector
)的元素,可以使用std::rotate
。
行
std::rotate
不做您想做的事。它将 copy(a,a+x,b);
的前x
个元素复制到a
,没有偏移量。如果b
为2,则等效于:
x
您需要做的事情:
b[0] = a[0];
b[1] = b[1];
要实现这一点,您需要使用:
b[0+x] = a[0];
b[1+x] = a[1];
...
b[n] = a[n-x-1];
行
std::copy(a, a+(n-x), b+x);
不正确。
您想从copy(b,b+x,a+n);
复制到a
,而不是从b
复制到b
。
使用a
立即导致使用越界索引访问数组,这将导致未定义的行为。
该调用中使用的偏移量完全没有意义。
a+n
的第一行执行后,您需要执行以下操作:
std::copy
要实现这一点,您需要使用:
b[0] = a[n-x];
b[1] = a[n-x+1];
...
b[x-1] = a[n-1];
数组必须具有确定的大小一些编译器接受您的代码,而另一些则不接受因此,请尝试使用指针代替