【问题标题】:How to generate an Array with a variable as size?如何生成一个以变量为大小的数组?
【发布时间】:2021-09-12 18:35:04
【问题描述】:

我正在尝试使用此函数将数组作为参数传递。在函数中,我让用户输入数组的大小,以及所述数组中的值。我想不通的是如何在 main 中声明变量以允许我在 main 中使用该函数,更具体地说,如何在事先不知道大小的情况下在 main 中声明数组变量(用户在函数中输入大小)。

void arrayFunction(int array1[], int arraySize);
    
int main() {
    
    int arrayLength;
    int arrayMain[];
    cout << "Enter length of array: " << endl;
    cin >> arrayLength;
        
    arrayFunction(arrayMain, arrayLength);
    
    return 0;
}

void arrayFunction(int array1[], int arraySize)
{
    cout << "Enter length of array: " << endl;
    cin >> arraySize;
    
    for(int i = 0; i < arraySize; i++)
    {
        cout << "Enter value #" << i + 1 << endl;
        cin >> array1[i];
    }
}

【问题讨论】:

  • 你不能。如果您在编译时不知道大小,请使用std::vector。参见例如stackoverflow.com/questions/10865861/…
  • C++ 要求数组的大小是编译时常量表达式。理由是普通程序员(意思是不编写标准库模块时)应该使用std::vector
  • 最简单的方法是使用std::vector。困难的方法是编写一个程序,当知道大小时,它会将源代码输出到编译器,然后运行生成的可执行文件。 (困难的方式类似于 Oracle 如何为某些查询生成代码以使其运行得非常快。)

标签: c++ arrays function


【解决方案1】:

正如 cmets 所说,最好的办法是改用 std::vector&lt;int&gt;

#include <vector>

std::vector<int> arrayFunction(){
    int arraySize;
    cout << "Enter length of array: " << endl;
    cin >> arraySize;

    std::vector<int> result(arraySize);

    for(int i = 0; i < arraySize; i++)
    {
        cout << "Enter value #" << (i + 1) << endl;
        cin >> result[i];
    }
    return result;
}

如果您无权访问std::vector,则需要使用动态分配的数组构建类似的东西:

int* arrayFunction() {
    ...
    // instead of the std::vector<int> line, you can just do this:
    int* result = new int[arraySize];
    ...
}

但您需要确保在使用完内存后致电delete [] array;std::vector 会自动执行此操作,因此它通常是动态数组更安全的方法。

【讨论】:

    【解决方案2】:

    使用矢量会很棒。但是你也可以使用传统的指针来实现这个所谓的动态数组。然后可以在运行时而不是编译时指定此数组大小。

    只是对您的代码稍作修改:

    #include<iostream>
    using namespace std;
    
    void arrayGenerator(int* , int );
    void arrayPrinter(const int* pArray, int arraySize);
    
    int main() {
        int arrayLength;
        cout << "Enter length of array: " << endl;
        cin >> arrayLength;
        int* pArray = new int[arrayLength];
        arrayGenerator(pArray, arrayLength);
        arrayPrinter(pArray, arrayLength);
        delete [] pArray;
        return 0;
    }
    void arrayGenerator(int* pArray, int arraySize) {
        for(int i = 0; i < arraySize; i++)
        {
            cout << "Enter value #" << i + 1 << endl;
            cin >> pArray[i];
        }
    }
    
    void arrayPrinter(int* pArray, int arraySize) {
        cout << "This is the given array: \n";
        for (int i = 0; i < arraySize; i++)
            cout << i << " ";
        cout << endl;
    }
    

    【讨论】:

    • 传统不是编程的好特质。事实上,不鼓励显式使用运算符 newdelete,因为建议使用 C++11/C++14 (make_unique) 和 RAII 模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2012-11-25
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多