我怎样才能返回数组c ++?

时间:2014-10-09 00:25:52

标签: c++ pointers

我正在尝试生成一些乐透号码并返回包含这些数字的数组,但我无法继续;请帮忙

void getLotto(int rad[7]) {
    int numbers[7];

    for (int i = 0; i < 7; i++) {
        numbers[i] = rand() % 35 + 1;
    }

    for (int j = 0; j < 7; j++) {
        int n = rand() % 35 + 1;
        if (n == numbers[j]) {
            numbers[j] = rand() % 35 + 1;

            return;
        }
    }
}

5 个答案:

答案 0 :(得分:2)

无法通过函数返回数组。一个常见的事情是动态分配数组并返回指向其第一个元素的指针。这将适用于您的情况,但会产生调用者管理内存的要求(delete[] new[]内存)。这就是为什么C ++为我们提供标准数组类的原因:使用并返回std::vector。如果您支持C ++ 11,请返回std::array

答案 1 :(得分:0)

以下情况可能有所帮助,请使用Fisher–Yates_shuffle

// Fisher–Yates_shuffle
// http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
std::vector<int> FisherYatesShuffle(std::size_t size, std::size_t max_size, std::mt19937& gen)
{
    assert(size < max_size);
    std::vector<int> res(size);

    for(std::size_t i = 0; i != max_size; ++i) {
        std::uniform_int_distribution<> dis(0, i);
        std::size_t j = dis(gen);
        if (j < res.size()) {
            if (i != j) {
                res[i] = res[j];
            }
            res[j] = 1 + i;
        }
    }
    return res;
}

Live example

答案 2 :(得分:0)

std::vectorstd::array优于常规数组,但如果您想使用常规数组,则可以按如下方式修改函数:

// Arguments: renamed the array, added N (# of array elements)
void getLotto(int numbers[], size_t N) {
    //int numbers[7]; // commented out local variable

    for (int i = 0; i < N; i++) {
        numbers[i] = rand() % 35 + 1;
    }

    for (int j = 0; j < N; j++) {
        int n = rand() % 35 + 1;
        if (n == numbers[j]) {
            numbers[j] = rand() % 35 + 1;

            return;
        }
    }
}

int numbers[]中的括号表示参数是一个数组,实际传递的是指向数组第一个元素的指针。修改numbers中的getLotto()会修改传递给函数的数组。

第二个参数的类型为size_t,因为它是系统用来表示对象大小(如数组)的无符号整数类型的平台相关别名。

这不是那么安全,因为函数必须相信numbers实际上有N元素,但这就是你有一个函数修改常规数组而不是{{{}这样的容器的方法。 1}}。

您可以像这样调用函数:

std::vector

答案 3 :(得分:0)

C ++不允许将整个数组作为参数返回给函数。但是,您可以通过指定不带索引的数组名称来返回指向数组的指针。

如果要从函数返回单维数组,则必须声明一个返回指针的函数,如下例所示:

int * myFunction()
 {
  .
  .
  .
 }

要记住的第二点是C ++不主张将局部变量的地址返回到函数外部,因此您必须将局部变量定义为静态变量。

现在,考虑以下函数,它将生成10个随机数并使用数组返回它们并按如下方式调用此函数:

#include <iostream>
#include <ctime>

 using namespace std;

// function to generate and retrun random numbers.
int * getRandom( )
 {
  static int  r[10];

 // set the seed
 srand( (unsigned)time( NULL ) );
  for (int i = 0; i < 10; ++i)
 {
r[i] = rand();
cout << r[i] << endl;
}

  return r;
  }

 // main function to call above defined function.
 int main ()
{
  // a pointer to an int.
  int *p;

   p = getRandom();
  for ( int i = 0; i < 10; i++ )
   {
   cout << "*(p + " << i << ") : ";
   cout << *(p + i) << endl;
  }

 return 0;
  }

当上面的代码一起编译并执行时,它产生的结果如下

624723190
1468735695
807113585
976495677
613357504
1377296355
1530315259
1778906708
1820354158
667126415
*(p + 0) : 624723190
*(p + 1) : 1468735695
*(p + 2) : 807113585
*(p + 3) : 976495677
*(p + 4) : 613357504 
*(p + 5) : 1377296355
*(p + 6) : 1530315259
*(p + 7) : 1778906708
*(p + 8) : 1820354158
*(p + 9) : 667126415

答案 4 :(得分:0)

有两种主要方法可以实现这一目标。

注意:我不确定你的第二个for循环是做什么的。我想这是为了确保这些数字都是独一无二的?你可能想看看它,因为它不是它正在做的事情。 出于这个问题的目的,我将其剪切为仅生成随机数来填充数组。

第一个是获取代码并修复它以将生成的数字放入传入的数组中:

#include <iostream>

void getLotto(int numbers[7]) {

    for (int i = 0; i < 7; i++) 
        {numbers[i] = rand() % 35 + 1;}

    return;
}

int main()
{
    srand(time(0));
    int lotto_numbers[7];
    getLotto(lotto_numbers);
    for (int i = 0; i < 7; i++) 
        {std::cout<<lotto_numbers[i]<<std::endl;}
}

numbers实际上并未作为int[]传入,而是作为指向数组的int*。这意味着您在函数中对其所做的任何更改都会在原始数据中更改 请记住,您需要跟踪数组边界,因为数组可以定义为

int lotto_numbers[6]

这意味着

numbers[7]

会超出范围。

第二种方法是在堆上创建数组。这意味着您不需要传入数组,但可以在函数中实例化它

我实际上并没有在这里提供此代码。主要是因为对于像这样简单的东西,内存管理比它的价值更麻烦。 (你需要记得为堆上创建的所有内容调用delete[])。

相反,让我们使用内置内存管理的东西:

#include <iostream>
#include <vector>

std::vector<int> getLotto() {
    std::vector<int> numbers;
    numbers.reserve(7);
    for (int i = 0; i < 7; i++) {
        //numbers[i] = rand() % 35 + 1;
        //would work, but is unsafe as you could potentially reference somthing out of range
        //this is safer:
        numbers.push_back(rand() % 35 + 1);
    }

    return numbers;
}

int main()
{
    srand(time(0));
    std::vector<int> lotto_numbers = getLotto();
    for (auto i = lotto_numbers.begin(); i != lotto_numbers.end(); i++)
    {
        std::cout<<*i<<std::endl;
    }
}

该向量为您处理内存管理。可以返回向量,返回的向量仍将指向刚刚填充的堆上的已分配内存。我们不需要释放它,因为当向量超出范围时,这将自动完成。