[英]reverse c++ array
我的目标是将数组3,12,2,1反转为1,2,12,3。 当我运行此代码时,我得到的垃圾在实际结果之前。 我似乎看不出问题出在哪里
#include<iostream>
using namespace std;
int rev (int arr[], int a){
//int r;
for(int i =a-1; i>=0; i--){
cout<<arr[i]<<" ";
}
return 0;
}
int main(){
int arr[] = {6,41,12,5,2};
cout<<"The rev of {6,41,12,5,2}"<<endl;
cout<<rev(arr, sizeof(arr))<<endl;
system("pause");
return 0;
}
如果允许您使用STL的反向(),则该问题的最佳答案是:
std::reverse
http://www.sgi.com/tech/stl/reverse.html
int main()
{
int arr[] = {6,41,12,5,2};
cout<<"The rev of {6,41,12,5,2}"<<endl;
reverse(arr, arr + 5);
copy(arr, arr + 5, ostream_iterator<int>(cout, ", "));
}
使用sizeof(arr)/sizeof(arr[0])
代替sizeof(arr)
。
sizeof(arr)
给出数组的总大小。 sizeof(arr[0])
是一个数组元素的大小(所有元素都具有相同的大小)。 因此sizeof(arr)/sizeof(arr[0])
是元素的数量。
sizeof返回以字节为单位的大小。 在您的示例中,如果sizeof(int)= 4,则返回20。
因为使用的是数组,所以还必须保持数组大小方便。 sizeof
计算内存中值的大小,在这种情况下,用于表示arr
的所有内存的大小。 您可以执行sizeof(arr)/sizeof(int)
来获取数组中元素的数量。 这是有道理的,因为它将占用数组的总大小,然后将其除以数组中元素的大小。 但是请注意,这仅适用于数组( int arr[4] = {6,41,12,5,2};
)。 如果它是通过类似int* i = new int[4];
的指针指向堆分配的数组,则int* i = new int[4];
您需要保持数组的大小不变。
同样,您正在cout<<
调用中调用反向函数,这将打印函数的返回值(在这种情况下,它的硬编码为0)。
事实证明,C ++标准库中有一个函数( std :: reverse )可以做到这一点。
如果我可以主观地和不合时宜地谈论您的方法,那是非常不像C的。 我个人最喜欢的反转数组的方式如下:
void reverse(int *a, int n)
{
int *p = a, *q = a + n - 1;
while (p < q)
{
int swap = *p;
*p++ = *q;
*q-- = swap;
}
}
// Usage:
int a [] = { /* ... */ };
reverse(a, sizeof(a)/sizeof(*a));
当然,由于您的问题被标记为c++
,因此始终存在std::reverse()
。
sizeof运算符返回一个额外的值(arrayLength + 1),这里6将在传递6时返回,存储在a-1中时,您将得到5,但数组索引从0长度1开始,即从0到4,这里我指向索引5不是最后一个元素last + 1为何获得垃圾值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.