[英]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_back
或emplace_back
即可將元素添加到其中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.