jaki zakres oparte na pracy dla zwykłych tablic?
Czy to czytać jak
będę odpowiedzieć zakładając, że - Weźmy następujący przykład za pomocą zagnieżdżonych tablic „Powiedz mi, co robi dla wahała-(z tablicami)?”:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Tekst wersja:
ia
jest tablicę tablic tablicę ("nested"), zawierające [3]
tablic, a każda zawierająca [4]
wartości. Powyższy przykład wykonuje pętlę przez ia
według jej podstawowego "zakresu" ([3]
), a zatem pętle [3]
razy. Każda pętla generuje jedną z wartości podstawowych ia
, zaczynając od pierwszej i kończąc na ostatniej - tablicą zawierającą wartości [4]
.
- pierwszej pętli:
pl
równa {1,2,3,4}
- Tablica
- Druga pętla:
pl
równa {5,6,7,8}
- Tablica
- Trzecia pętla:
pl
równa {9,10,11,12}
- Tablica
Zanim wyjaśnimy proces , oto kilka przyjaznych przypomnień o tablicach:
- Tablice są interpretowane jako wskaźniki do ich pierwszej wartości - Korzystanie z tablicą bez iteracji zwraca adres pierwszej wartości
pl
musi być punktem odniesienia, ponieważ nie możemy skopiować tablice
- z tablicami, podczas dodawania numer do samego obiektu tablicowego, przesuwa się do przodu tyle razy i "wskazuje" na równoważny wpis - jeśli numer jest liczbą
n
, to ia[n]
jest tym samym, co *(ia+n)
(Wywołujemy adresy o numerach od n
) i ia+n
jest taka sama jak &ia[n]
(Otrzymujemy adres tego wpisu i w tablicy).
Oto co się dzieje:
- Na każdej pętli
pl
jest ustawiony jako odniesienia do ia[n]
z n
równa bieżącej licznika pętli począwszy od 0. Tak więc, pl
jest ia[0]
w pierwszej rundzie, po drugiej to ia[1]
i tak dalej. Pobiera wartość przez iterację.
- Pętla działa tak długo, jak
ia+n
jest mniejsza niż end(ia)
.
... I o to chodzi.
To naprawdę tylko uproszczony sposób napisać ten:
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];
Jeśli tablica nie jest zagnieżdżona, to proces ten staje się nieco łatwiejsze, że odwołanie nie jest potrzebne, ponieważ iterowana wartość nie jest tablicą, ale raczej "normalną" wartością:
int ib[3] = {1,2,3};
// short
for (auto pl : ib)
cout << pl;
// long
for (int n = 0; n != 3; ++n)
cout << ib[n];
Niektóre dodatkowe informacje
Co zrobić, jeśli nie chcemy, aby użyć słowa kluczowego auto
podczas tworzenia pl
? Jakby to wyglądało?
W poniższym przykładzie pl
odnosi się do array of four integers
. Na każdej pętli pl
jest podana wartość ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
I ... To jak to działa, z dodatkowymi informacjami do sczyszczać wszelkie nieporozumienia. To po prostu "skrócona" pętla, która automatycznie liczy się dla ciebie, ale brakuje jej do odzyskania pętli prądowej bez robienia tego ręcznie.
Nie ma tablic "dynamicznych" w C lub C++ per se - istnieją typy tablic, a także wskaźniki, które mogą, ale nie muszą wskazywać na tablicę lub dynamicznie przydzielany blok pamięci, który zachowuje się jak tablica. Dla każdej tablicy typu T [n] jej rozmiar jest zakodowany w typie i można uzyskać do niego dostęp za pomocą 'for'. Ale w momencie, gdy macierz rozpada się na wskaźnik, informacja o rozmiarze jest tracona. – JohannesD
W twoim przykładzie liczba elementów w "liczbach" to na przykład "sizeof (numbers)/sizeof (int)". – JohannesD