簡體   English   中英

C ++中具有可變維度的二維數組

[英]2D array in C++ with variable dimentions

所以我在自學 C++,我對數組有疑問。 我知道,如果我聲明一個二維數組,如:

char board[8][8];

我創建了一個高度和寬度為 8 的二維數組。但是,我想知道是否有辦法將這些尺寸設置為變量,以便用戶可以輸入他們想要的高度和寬度,我在 C++ 和 Visual Studio 中嘗試了這個不開心。

int rowSize = 0;  
int colSize = 0;
cin >> rowSize >> colSize;
char board[rowSize][colSize];

誰能幫我?

由於這是用c++標記的,因此std::vector可能適合您。 它很像一個數組,但更方便,更適合這個目的。 您可以使用此初始化程序調用簡單地初始化嵌套向量的 2D 數組(感謝 Bob__ 提供了這個更簡單的解決方案):

int n = 5;
int m = 10;
std::vector<std::vector<char>> board (n, std::vector<char>(m, 'a'));

這將創建板並將所有字段初始化為'a' ,每個示例。 您可以使用與 C 樣式數組相同的語法訪問和操作數據:

char x = board[4][2];
board[3][3] = 'o';

最后但並非最不重要的一點是,有許多方便的特性和函數使您可以比使用 C 樣式數組更輕松地執行復制等操作。 在此處查看std::string的文檔。

如果要分配此類矩陣,請使用向量並使用i + j * rowSize

另一個結構不符合 c++,它是 C99(可變長度數組)的 gcc 擴展,它們的等價物(或多或少)是向量或指向數組的唯一指針。

如果您真的想這樣做,您可以執行以下操作:

int* myPointer = nullptr;   // Pointer to int, initialize to nothing.
int sizeOfArray;           // Size needed for array
std::cin >> sizeOfArray;        // At runtime get the size of the array
myPointer = new int[sizeOfArray];  // Allocate array of specified size and save ptr in a.
for (int i = 0; i < sizeOfArray; i++) {
    myPointer[i] = 0;    // Initialize all elements to zero.
}
delete[] myPointer;  // When done, free memory pointed to by myPointer.
myPointer = nullptr;     // Clear a to prevent using invalid memory reference.

盡管我強烈建議您改用矢量

不,你不能在符合 C++ 中,因為標准沒有定義可變長度數組 (*)。

如果不需要連續分配(真正的二維數組底層存儲),可以使用vector的vector。 這通常是最簡單和慣用的方式:

std::vector<std::vector<char>>(8, std::vector<char>(8, '\0'));

如果您可以接受函數類型訪問,則可以使用大小為 64 (8*8) 的底層一維向量和返回引用的訪問器方法構建自定義容器。

如果你想用一個底層真正的 2D 數組來模擬 2D 容器,那么你就有麻煩了。 我試圖構建一個通用的多維容器(代碼審查中的代碼),並意識到您無法在非標准容器上正確實現隨機訪問迭代器......


(*) 當然,gcc 很樂意接受 C++ 中的 VLA 作為該語言的文檔擴展......

暫無
暫無

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

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