【问题标题】:C++ : Creating an array with a size entered by the userC ++:创建具有用户输入大小的数组
【发布时间】:2015-02-20 09:23:04
【问题描述】:

我想知道我们是否可以创建一个用户指定大小的数组。

例如:

int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];

上述程序无法运行,因为数组大小必须是编译时常量,但在我的情况下,它是一个变量。

是否可以将变量变为常量并将其分配为数组的大小?

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    在 C++ 中,有两种存储类型:基于 stack 的内存和基于 heap 的内存。基于堆栈的内存中对象的大小必须是静态的(即不改变),因此必须在编译时知道。这意味着您可以这样做:

    int array[10]; // fine, size of array known to be 10 at compile time
    

    但不是这个:

    int size;
    // set size at runtime
    int array[size]; // error, what is the size of array?
    

    注意常量值和编译时已知的值之间是有区别的,这意味着你甚至不能这样做:

    int i;
    // set i at runtime
    const int size = i;
    int array[size]; // error, size not known at compile time
    

    如果您想要一个动态大小的对象,您可以使用某种形式的new 运算符来访问基于堆的内存:

    int size;
    // set size at runtime
    int* array = new int[size] // fine, size of array can be determined at runtime
    

    但是,new 的这种“原始”用法不推荐,因为您必须使用 delete 来恢复分配的内存。

    delete[] array;
    

    这很痛苦,因为您必须记住 delete 您使用 new 创建的所有内容(并且只有 delete 一次)。幸运的是,C++ 有许多数据结构可以为您执行此操作(即,它们在幕后使用 newdelete 来动态更改对象的大小)。

    std::vector 是这些自我管理数据结构的一个示例,是数组的直接替代品。这意味着您可以这样做:

    int size;
    // set size at runtime
    std::vector<int> vec(size); // fine, size of vector can be set at runtime
    

    不必担心newdelete。它会变得更好,因为std::vector 会在您添加更多元素时自动调整自己的大小。

    vec.push_back(0); // fine, std::vector will request more memory if needed
    

    总结:除非在编译时知道大小,否则不要使用数组(在这种情况下,不要使用new),而是使用std::vector

    【讨论】:

    • int size; // set size at runtime int* array = new int[size] 不适合我。我正是这样做的,但它是一个二维数组。说值 n 必须是一个常数。我的代码:int n; cin &gt;&gt; n; float* matrixA = new float[n][n]; 将 int n 更改为 const int n 时,我得到完全相同的消息。有什么想法吗?
    • 啊 nvm 想通了。我必须使用该语法使它们成为一维数组,然后遍历它,为每个数组添加新的 float[n]
    • 答案很明确,但我不同意最后的说法,在很多情况下,您会希望使用newdelete 在堆上分配一个数组没有std::vector 引入的开销。
    【解决方案2】:

    使用std::vector(需要标头&lt;vector&gt;):

    int size;
    cout<<"Enter desired size of the array";
    cin >> size;
    std::vector<int> array(size);
    

    【讨论】:

    • 正如我所说,我是 C++ 新手。您能否提供一个简短的解释,谢谢:)
    • 您可以查看其中一个文档 www.cplusplus.comen.cppreference.com
    • 但这不是创建一个向量而不是一个数组吗?
    • @MohitBhasi vector 类在底层实现为数组。
    • @Algo;幸运的是,在这种情况下,这完全无关紧要。
    【解决方案3】:

    使用动态分配

    More on dynamic memory in C++

    #include <iostream>
    
    int main() {
        int size;
        std::cout <<"Enter desired size of the array";
        std::cin >> size;
        int *array = new int[size];
    }
    

    正如上面链接文章中提到的:

    在大多数情况下,动态分配的内存只需要在程序中的特定时间段内进行;一旦不再需要它,就可以释放它,以便内存再次可供其他动态内存请求使用。这就是操作符删除的目的。

    当您完成array 后,您应该使用以下语法将其删除:

    delete[] array; 
    

    使用std::vector

    More on vectors

    #include <iostream>
    #include <vector>
    
    int main() {
        int size;
        std::cout <<"Enter desired size of the array";
        std::cin >> size;
        std::vector<int> array(size);
    }
    

    【讨论】:

    • 如果您要向初学者展示如何动态分配数组,那么只有在您还展示如何再次删除它时才公平。不要让它看起来比实际更容易。
    • 这就是上面链接的用途
    • 当然可以,但是为什么要提供一个独立的示例来展示不良做法呢?
    • @Algo 非常感谢!对向量一无所知,所以第一个选项帮助我理解了一个新概念
    • @ChrisDrew ok 所以对于vectors,没有内存泄漏的问题,但是当使用new分配内存时,它必须被删除以防止内存泄漏
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多