簡體   English   中英

C++:使用“auto”在二維數組上嵌套 For 循環

[英]C++: Nested For-loops over 2 dimensional array with “auto”

為了在 C++ 中循環一個名為“a”的 3x3 數組,我使用了以下代碼。

int a[3][3] {};
for(auto &b: a) {
  for(auto &c: b) {
    std::cout << c << std::endl;
  }
}

如果我必須更換“自動”,我會直觀地嘗試

int a[3][3] {};
for(int &(b[3]): a) {
  for(int &c: b) {
    std::cout << c << std::endl;
  }
}

但這不起作用。 相反,我發現以下工作。

int a[3][3] {};
for(int (&b)[3]: a) {
  for(int &c: b) {
    std::cout << c << std::endl;
  }
}

所以問題是:為什么后一個例子有效?

我以為我需要一個長度為 3 的數組的引用,但我需要一個包含引用的長度為 3 的數組。

int &(b[3])等價於int & b[3] ,即長度為 3int引用數組 這與數組int a[3][3]中元素的類型不對應。

數組int a[3][3]中的元素是 int int[3] 3] 類型,即長度為 3 的int數組 通過將b聲明為int(&b)[3]您聲明了對這種類型的引用。

如果你有這樣的數組

T a[N1][N2][N3];

其中T是某個類型說明符, N1N2N3是數組的大小,然后對該數組的引用將如下所示

T ( &ra )[N1][N2][N3]  = a;

如果您需要聲明對(元素)類型為T[N2][N3]的數組元素的引用,那么您可以編寫例如

T ( &e )[N2][N3] = a[0];

返回到您的示例,您聲明了一個數組

int a[3][3] {};

此數組的元素具有int[3]類型。 因此,要聲明對數組元素的引用,您必須編寫

for ( int ( %row )[3] : a )

至於這個聲明

int &(b[3])

(括號是多余的)然后它聲明了一個包含三個元素的數組,類型為int & 但是,根據 C++ 標准,您不得聲明引用數組。

來自 C++ 標准(8.3.4 陣列)

1 在聲明 TD 中,其中 D 具有以下形式

D1 [ constant-expressionopt] attribute-specifier-seqopt

且聲明T D1 中標識符的類型為“derived-declarator-type-list T”,則D的標識符類型為數組類型; 如果 D 的標識符的類型包含 auto 類型說明符,則程序格式錯誤。 T稱為數組元素類型; 此類型不應是引用類型、(可能是 cvqualified)類型 void、function 類型或抽象 class 類型...。

暫無
暫無

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

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