繁体   English   中英

反向C ++数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM