簡體   English   中英

C++,如何制作長度不限於 integer 的數組?

[英]C++, how can I make an array with length not limited to an integer?

目前,C++ 僅允許將長度為整數的 arrays 聲明為整數。 有沒有辦法繞過它? 我正在嘗試創建一個程序來生成一個數組,該數組的長度可能達到數千甚至數百萬,具體取決於輸入,但限制為僅整數長度的數組聲明讓我望而卻步。

評論基本上,假設我想創建一個 5 行 500,000 列的二維數組,我會遇到分段錯誤。

std::array的原型是

template<class T, std::size_t N> struct array;

根據https://en.cppreference.com/w/cpp/types/size_t

std::size_t可以存儲任何類型(包括數組)理論上可能的 object 的最大大小。 大小不能由std::size_t表示的類型是格式錯誤的(C++14 起)

(強調我的)

因此,根據定義,C++ 不能表達大小大於std::size_t的 object 的概念。

幸運的是,在大多數平台上, std::size_t至少為 32 位,這意味着它不僅可以達到數百萬,而且可以達到數十億。 如果你在一個比它更小的平台上,那么大概你的硬件在物理上無論如何都不能存儲更大的對象。


更新:在您添加的評論中

對不起,我應該更具體。 基本上,假設我想創建一個 5 行 500,000 列的二維數組,我會遇到分段錯誤。

如果這里的問題是語言的限制,你會得到一個編譯器錯誤,而不是運行時錯誤。

由於您遇到運行時錯誤,因此問題出在您的平台上,而不是語言上。 在這種特殊情況下,“問題”是它沒有為您提供足夠的堆棧空間來支持堆棧幀中的數兆字節對象。 (如果你問我,這是一個非常明智的限制。)相反,你會想要在堆上分配你的數據。

我可以給你一些代碼,讓你的問題 go 現在消失,但你真正需要做的是閱讀堆棧和堆,了解它們是什么以及如何使用它們。

#include <iostream>

int main() {
    int n = 0;
    std::cin >> n;
    int *arr = new int[n]; // dynamic declaration of variable length array
    for(int i = 0; i < n; ++i)
        std::cin >> arr[i]; // read array elements
    return 0;
}

編輯:對於二維數組

#include <iostream>

int main() {
    int **arr;
    int r, c;
    std::cin >> r >> c;

    // Create an array of row heads
    arr = new int *[r];

    // Create an 2d array
    for (int i = 0; i < r; ++i) arr[i] = new int[c];

    // read input in 2d array
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j) std::cin >> arr[i][j];

    // print 2d array
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j) std::cout << arr[i][j] << ' ';
    return 0;
}

std::vector是更好的選擇。 您只需要push_backemplace_back即可將元素添加到其中。

更多詳情: http://www.cplusplus.com/reference/vector/vector/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM