Wie funktioniert die bereichsbasierte Funktion für einfache Arrays?
Soll das lauten: " Sag mir, was ein Fernkampf macht (mit Arrays)? "
Ich antworte unter der Annahme, dass - Nehmen Sie das folgende Beispiel mit verschachtelten Arrays:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Textversion:
iaist ein Array von Arrays ("verschachteltes Array"), die [3]Arrays enthalten , wobei jedes [4]Werte enthält. Das obige Beispiel durchläuft iaseinen primären 'Bereich' ( [3]) und durchläuft daher die [3]Zeiten. Jede Schleife erzeugt eine von ia‚s [3]Primärwerte aus dem ersten und endend mit dem letzten - Ein Array mit [4]Werten.
- Erste Schleife:
plgleich{1,2,3,4} - Ein Array
- Zweite Schleife:
plgleich{5,6,7,8} - Ein Array
- Dritte Schleife:
plgleich {9,10,11,12}- Ein Array
Bevor wir den Prozess erklären, sind hier einige freundliche Erinnerungen an Arrays:
- Arrays werden als Zeiger auf ihren ersten Wert interpretiert. Wenn Sie ein Array ohne Iteration verwenden, wird die Adresse des ersten Werts zurückgegeben
pl muss eine Referenz sein, da wir keine Arrays kopieren können
- Wenn Sie bei Arrays dem Array-Objekt selbst eine Nummer hinzufügen, wird diese um ein Vielfaches vorwärts weitergeleitet und auf den entsprechenden Eintrag "gezeigt". Wenn
nes sich um die betreffende Nummer handelt, ia[n]ist dies dieselbe wie *(ia+n)(Wir dereferenzieren die Adresse, die nEinträge enthält forward) und ia+nist dasselbe wie &ia[n](Wir erhalten die Adresse dieses Eintrags im Array).
Folgendes ist los:
- Wird in jeder Schleife
plals Referenz auf gesetzt ia[n], wobei ndie aktuelle Schleifenzahl ab 0 gleich plist. Ist also ia[0]in der ersten Runde, in der zweiten ist esia[1] und so weiter. Der Wert wird per Iteration abgerufen.
- Die Schleife dauert so lange an, wie sie
ia+nkleiner als ist end(ia).
... und das war's auch schon.
Es ist wirklich nur eine vereinfachte Art, dies zu schreiben :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
Wenn Ihr Array ist nicht verschachtelt, dann wird dieser Prozess etwas einfacher, dass eine Referenz nicht erforderlich, da der iterierten Wert kein Array ist , sondern ein ‚normaler‘ Wert:
int ib[3] = {1,2,3};
// short
for (auto pl : ib)
cout << pl;
// long
for (int n = 0; n != 3; ++n)
cout << ib[n];
Einige zusätzliche Informationen
Was wäre, wenn wir das autoSchlüsselwort beim Erstellen nicht verwenden wollten?pl ? Wie würde das aussehen?
Im folgenden Beispiel plbezieht sich auf eine array of four integers. In jeder Schleife plwird der Wert angegeben ia[n]:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
Und ... so funktioniert es, mit zusätzlichen Informationen, um Verwirrung zu beseitigen. Es ist nur eine Kurzschleife, fordie automatisch für Sie zählt, aber keine Möglichkeit bietet, die aktuelle Schleife abzurufen, ohne sie manuell auszuführen.
for. In dem Moment, in dem das Array in einen Zeiger zerfällt, gehen die Größeninformationen verloren.