【问题标题】:Reverse the sequence of an array in C++ [duplicate]在C ++中反转数组的序列[重复]
【发布时间】:2015-01-09 22:55:47
【问题描述】:

我正在尝试反转int-array 的序列。这是我的代码,它给出了一大堆错误。

#include <cstdlib>
#include <iostream>

using namespace std;

int [] reverseArray(int []);

int main(){
    int arr[5] = {3,9,11,2,7};
    int arr2[5] = reverseArray(arr);

    for (int i = 0; i < 5; ++i)
    {
        cout << arr2[i] << endl;
    }
}

int [] reverseArray(int param[]){
    int s = sizeof(param)/sizeof(param[0]);
    int j = 0;
    int* a[s];
    for (int i = s ; i >= 0; i--)
    {
        a[j] = param[i];
        j++;    
    }
    return a;
}

我需要将修改后的数组传回主函数。所以请不要建议我 void 自己处理输出的函数。

【问题讨论】:

  • fyi,标准库中还有一个std::reverse
  • 打印s 的值(在int s = sizeof(param)/sizeof(param[0]); 中)可能会给你一个线索。
  • 它们不是两个非常不同的问题。当您将数组作为参数传递时,您的数组会衰减。 sizeof(param) 并没有按照你的想法去做。
  • 这不是“什么是数组衰减”的副本。是的,OP 不知道数组衰减,但这不是问题也不是答案。
  • @NeilKirk,我认为这是一项任务。如果需要在生产代码中实际反转数组,那么是的,std:vector 或其他东西是更好的选择

标签: c++ arrays


【解决方案1】:

这是一个使用std::array 类的实现,它的工作方式更像您的预期。如果长度在编译时已知,则 reverse 函数能够获取任何大小和类型的数组。我还修复了您的反向逻辑中的错误。它在第一次迭代时超出了参数数组的范围。

此处的示例:http://ideone.com/UuUQ9c

#include <iostream>
#include <array>
using namespace std;

template<class T, size_t N>
std::array<T, N> reverseArray(const std::array<T, N>& param)
{
    int j = 0;
    std::array<T, N> a;
    for (int i = N - 1 ; i >= 0; i--)
    {
        a[j] = param[i];
        j++;    
    }
    return a;
}

int main()
{
    std::array<int, 5> arr = {3,9,11,2,7};
    std::array<int, 5> arr2 = reverseArray<int, 5>(arr);

    for (int i = 0; i < 5; ++i)
    {
        cout << arr2[i] << endl;
    }
}

【讨论】:

  • +1,不过如果arr 的长度发生变化,我更喜欢auto arr2 = reverseArray(arr); 以减少维护。
  • @RedAlert 好评论。我想保持直截了当。模板参数的重复不是最好的。
【解决方案2】:

如果您使用 C++,您可以通过以下方式简化您的解决方案:

    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    reverse(v.begin(),v.end());
    for(auto& e : v)
      cout << e << " ";

http://ideone.com/mDMSmZ

【讨论】:

  • 我不想使用向量,能否请您使用 C-Style 数组实现代码。
  • @SoumasishGoswami 向量在大多数情况下与数组一样快,而且它们更不容易出错。为什么要使用数组?
  • 应该是老师说的吧。
  • @ash 首先教初学者数组只是糟糕的教学。
  • @TimSeguine 我不一定同意。无论哪种方式,这对我来说都像是家庭作业。
【解决方案3】:

没有诸如事物返回类型int[],因为未知大小的变量不能位于堆栈上。

您的选择是:

const int* reverse(const int input[],size_t size){
   int* output = new int[size];//needed to be delete 
   ...
   return output;
}  

void reverse(int input_output[],size_t size){
   //use same array for input & output 
}  

void reverse(const int input[], int output[],size_t size){
   //get output as out parameter 
}  

如果你问我最好的选择是第 2 和第 3,如果可以更改输入,请使用第 2,如果需要输入和输出,请使用第 3。

【讨论】:

  • 你说得对,我修好了。
【解决方案4】:

不使用标准库:

仅使用int[] 类型并且没有动态分配,您不能将其作为返回值,因为生成的int[] 的大小在编译类型中是未知的。您仍然可以执行以下操作,获得相同的结果:

void reverse(const int a[], int size, int arr[]){
   int tmp, i;
   for (i=0; i < size; i++){
      arr[i]=a[i];
   }
   for (i = 0; i < size/2; ++i) {
      tmp = arr[size-i-1];
      arr[size-i-1] = arr[i];
      arr[i] = tmp;
   }
}

int main(){
   int size=5;
   int source[] = {3,9,11,2,7};
   int destination[size];
   reverse(source, size, destination);
}

使用标准库(推荐):

如果可用并且如果不是在特殊条件下(例如一些家庭作业/作业限制;))你应该更喜欢标准库算法:

int a[]= {...};
const int size = sizeof(a)/sizeof(int);
int b[size];

std::reverse_copy(a, a+size, b);

【讨论】:

  • 谢谢,但您能否修改代码以将其包含在单独的函数中,然后在 main.js 中调用它。我对 C 的那部分更困惑。
  • 现在标准库中也有std::array,如果在编译时知道大小的话。
  • 问题明确表示他不想要就地反向(最后一段)
  • @Paul 你是对的,相应地修改答案......
  • @SoumasishGoswami 我将它封装在一个函数中,执行深拷贝(这样你的原始数组就不会受到影响)。
【解决方案5】:

我尝试对您的代码应用最小的更改。这是有效的方法:

#include <cstdlib>
#include <iostream>

using namespace std;

int * reverseArray(int, int []);

int main(){

    int arr[5] = {3,9,11,2,7};
    int sz = sizeof ( arr ) / sizeof ( arr[0] );
    int * arr2 = reverseArray(sz, arr);

    for (int i = 0; i < 5; ++i)
    {
        cout << arr2[i] << endl;
    }


}

int * reverseArray(int s, int param[]){

    int j = 0;
    int * a = new int[s];
    for (int i = s - 1 ; i >= 0; i--)
    {
        a[j] = param[i];
        j++;
    }

    return a;
}

解释:

  • 数组通过指针传递给函数。所以,你无法确定它的大小。您必须事先确定大小并将大小作为函数参数传递。
  • 分配数组的方式是函数本地的。您需要分配动态内存才能将其传回。

【讨论】:

  • 内存泄漏怎么办?
  • 这段代码真的很有帮助,让我理解一下吧。因此,在函数 reverseArray 中,您返回的是指向数组 a? 的指针
  • a 指向在堆上分配的数组。此指针的副本从函数返回。指针a 和它指向的数组是独立的实体。
  • @NeilKirk 只是出于好奇,我们不应该删除所有使用 new 创建的变量
  • 是的,这就是为什么我不鼓励任何带有new 的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多