簡體   English   中英

如何聲明一個可以接受任何大小的二維向量參數?

[英]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.

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