【问题标题】:Create randomly sized (within a certain range) arrays over many iterations在多次迭代中创建随机大小(在一定范围内)的数组
【发布时间】:2016-02-18 18:08:12
【问题描述】:

我正在尝试创建许多由随机数和随机大小组成的数组,例如 1 到 20 个元素。我的代码有时会起作用。

我正在使用我想要的范围之间的随机数来确定数组大小。如果第一次迭代产生一个值为 10 的数组大小,那么由于某种原因,我的代码不想创建任何大小大于 10 的数组。将创建各种数组(并将输出这些数组的列表),直到某个迭代会产生一个大于 10 的随机数。然后我得到这个错误:

数组索引超出范围 numbers->[11] 有效到 numbers[9]

“数字”是数组的名称。这是我的代码的相关部分:

srand(time(0));
int j, flag = 0;
int temp;
int rand=1;

for(int t=0; t<50; t++)
{
    int length = rand()% 20 + 1;
    cout<<"length is " << length << endl;
    int numbers[length];

    for(int i = 0; i < length; i++)
    {
        numbers[i]=rand();
        cout << numbers[i] << endl;
    }

    for(j=0; (j<=length); j++)
    {
        for (int i=0; i<(length-1); i++)
        {
            if(numbers[i+1]<numbers[i])
            {
                temp=numbers[i];
                numbers[i]=numbers[i+1];
                numbers[i+1]=temp;
                flag++;
            }
        }
    }

    cout << "Number of Swaps : " << flag << endl;
}

【问题讨论】:

  • 我假设它与数组长度不更新有关?
  • 代码看起来不错,我没有发现任何可疑之处。
  • 另外,我无法在我的计算机上重现该问题。它是实际代码,还是只是它的简化版本?贴出实际代码。
  • int numbers[length] 是非标准的。不过,如果这会导致这个问题,我会想办法。最后一个循环中的is 在你的程序中都不是秘密的js,是吗?
  • 这不可能是您正在运行的确切代码,它在第二个for 上缺少右括号,并且此定义int rand=1; 会在您尝试调用时导致编译错误rand() 函数。

标签: c++ arrays


【解决方案1】:

正如@Bob__ 所写,分配可变长度数组不是 C++ 标准。它有时可能适用于特定的编译器,但可能会破坏其他编译器。

但也有不错的选择。您可以使用new 分配动态内存。例如:

int *array = new int[size];
array[0] = 3;
array[1] = 5;
cout << array[1];
delete [] array;

之后别忘了用delete 删除内存。

或者你可以使用vector&lt;int&gt;。它是一个 STL 容器,正是为此目的而制造的。

#include <vector>
using namespace std;
...
vector<int> vec(size);
vec[0] = 3;
vec[1] = 5;
cout << vec[1];

【讨论】:

  • 并且 std::vector 是标准的一部分。所以这里在这种情况下真的没有理由使用int[]
【解决方案2】:

可变长度数组不在 C++ 标准中,但仅由某些编译器作为扩展提供。我不会相信他们,你的代码中也不需要这样的东西。 您可以在外部 for 循环之外声明您的数组,因为您知道它的最大长度:

#define MAXL 20

int numbers[MAXL];

for ...
    int length = rand() % MAXL + 1;
    ...

此外,如果您正在实现冒泡排序,我认为内部 i 循环的条件应该是 i

【讨论】:

    【解决方案3】:
    1. rand 在两种情况下使用。作为变量int rand 和作为函数std::rand()。我建议删除任何using namespace std;,但由于无论如何都不需要该变量,您也可以删除int rand = 1;。请注意,rand() 是一个 C 函数。您可以使用它,但恕我直言 std::rand() 更纯 C++。
    2. int numbers[length]; 不会编译,因为 length 是一个非常数。请改用std::vector&lt;int&gt; numbers(length);

    就是这样。

    #include <iostream>
    #include <vector>
    #include <time.h>
    
    int main()
    {
        std::srand(time(0));
        int j, flag = 0;
        int temp;
    
        for (int t = 0; t < 50; t++)
        {
            int length = std::rand() % 20 + 1;
            std::cout << "length is " << length << std::endl;
            std::vector<int> numbers(length);;
    
            for (int i = 0; i < length; i++)
            {
                numbers[i] = std::rand();
                std::cout << numbers[i] << std::endl;
            }
    
            for (j = 0; (j <= length); j++)
            {
                for (int i = 0; i < (length - 1); i++)
                {
                    if (numbers[i + 1] < numbers[i])
                    {
                        temp = numbers[i];
                        numbers[i] = numbers[i + 1];
                        numbers[i + 1] = temp;
                        flag++;
                    }
                }
            }
    
            std::cout << "Number of Swaps : " << flag << std::endl;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2011-01-28
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2016-01-23
      • 2021-12-02
      • 2011-07-01
      • 2015-08-25
      相关资源
      最近更新 更多