[英]How to declare a 2D vector parameter which will accept any size?
我剛開始學習 C++。
我必須聲明一個方法來接受這樣的變量:
int grid1[200][200];
int grid2[20][25];
int grid3[53][40];
如何在方法中聲明該參數?
我找到了這個聲明,但我不知道它是否有用或如何使用它:
int** a = new int*[rowCount];
我會將該參數復制到一個動態的成員變量中(我認為它會在堆中,所以這就是它是動態的原因)。
對於靜態大小的數組,請使用std :: array 。 對於動態大小的數組,請使用std :: vector 。 除非有一些奇怪的情況強加給您,否則請不要使用原始C數組。
如果需要多維數組,則當然可以對std::vector<std::vector<int>>
array使用std::vector<std::vector<int>>
或類似的std::array
。 這很簡單方便,因為您可以執行myarray[row][column]
(可能足夠好了 )。 但是,性能更好的選擇通常是只聲明一個尺寸為“維度1 *維度2”的一維std::vector<int>
,然后在對其進行索引時執行myvector[row_number * size_of_row + column]
。 將一維數組視為2D數組就這么簡單,並且由於對CPU的預取器和緩存層次結構更友好,因此性能可能會更好。
至於聲明一個函數來接受這樣的數組-這很簡單。 例如:
void f(const std::array<int, 666>& myarray);
void f(const std::array<std::array<int, 42>, 666>& myarray);
void f(const std::vector<int>& myarray);
void f(const std::vector<std::vector<int>>& myarray);
使用std :: vector並忽略與普通數組有關的所有內容。
void foo(vector<vector<int>>& v)
{
...
}
// now you have a 100x50 double array
vector<vector<int>> x;
x.resize(100);
for(auto& xx : x)
{
xx.resize(50);
}
foo(v);
如果您喜歡注釋中提到的緩存 ,則可以創建一個一維向量並將其轉換為多維數組,我之前曾在這里詢問過動態數組。 或者,如果您的尺寸是靜態的,則可以簡單地:
vector<int> x(100);
int(*yy)[3] = (int(*)[3])x.data(); // Creates a 2D array inside x
yy[0][1] = 5;
yy[1][2] = 4;
yy[2][2] = 10;
使用行和列(例如x*col + row
進行內部計算以將一維數組手動轉換為2D不好並且容易出錯。
我之前發現的一個有趣技巧是可以使用如下模板:
template <int x, int y>
void myFunc(int (grid&)[x][y]) {
// implementation
}
這將使您的函數可以接受任何大小的數組。
缺點是因為它是模板,所以必須放在標頭(或程序中的某個地方)中,因此,如果它在API中,則會向用戶公開。
當然,如果您對使用數組不是很困難,那么還有vectors vectors選項(我認為其他人已經提到過):
void myFunc(std::vector<std::vector<int>> grid) {
// implementation
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.