Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 46

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

  ++cnt;                 // ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ cnt

 }

Π­Ρ‚ΠΎΡ‚ Ρ†ΠΈΠΊΠ» присваиваСт элСмСнтам массива ia Ρ‚Π΅ ΠΆΠ΅ значСния, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ», Π½ΠΎ Π½Π° сСй Ρ€Π°Π· ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ индСксами Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя систСма. ЗначСния элСмСнтов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, поэтому объявляСм ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ row ΠΈ col ΠΊΠ°ΠΊ ссылки (см. Ρ€Π°Π·Π΄Π΅Π» 3.2.3). ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ for ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ элСмСнты массива ia, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ массивами ΠΈΠ· 4 элСмСнтов. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΈΠΏΠΎΠΌ row Π±ΡƒΠ΄Π΅Ρ‚ ссылка Π½Π° массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ†ΠΈΠΊΠ» for ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих массивов ΠΏΠΎ 4 элСмСнта. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, col ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int&. На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ cnt присваиваСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту массива ia, Π° Π·Π°Ρ‚Π΅ΠΌ осущСствляСтся ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ cnt.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Π° использовались ссылки, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнты массива Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. Однако Π΅ΡΡ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для использования ссылок. Рассмотрим Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ»:

for (const auto &row : ia) // для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π²ΠΎ внСшнСм массивС

 for (auto col : row)      // для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ массивС

  cout << col << endl;

Π­Ρ‚ΠΎΠΌΡƒ Ρ†ΠΈΠΊΠ»Ρƒ запись Π² элСмСнты Π½Π΅ Π½ΡƒΠΆΠ½Π°, Π½ΠΎ всС ΠΆΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ пСрСмСнная внСшнСго Ρ†ΠΈΠΊΠ»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ ссылка. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ прСобразования ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ массива Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.3). Если ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Ρ‡ΡŒ ссылкой ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эти Ρ†ΠΈΠΊΠ»Ρ‹ Ρ‚Π°ΠΊ, Ρ‚ΠΎ компиляция ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ:

for (auto row : ia)

 for (auto col : row)

Как ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» for ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ элСмСнты массива ia, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ массивами ΠΏΠΎ 4 элСмСнта. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ row Π½Π΅ ссылка, ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятор ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива (ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° массива) Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт этого массива. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚ΠΈΠΏΠΎΠΌ row Π² этом Ρ†ΠΈΠΊΠ»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ int*. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» for Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½. НСсмотря Π½Π° намСрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, этот Ρ†ΠΈΠΊΠ» пытаСтся ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° int*.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π² сСрийном ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ for, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ всСх Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ самого Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ссылками.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы

Подобно Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ массивам, имя ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива автоматичСски прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π³ΠΎ элСмСнт.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ являСтся массивом массивов.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ являСтся массивом массивов, Ρ‚ΠΈΠΏ указатСля, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСобразуСтся массив, являСтся Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ массива.

int ia[3][4]; // массив Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 3 элСмСнта; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт - массив

              // ΠΈΠ· 4 Ρ†Π΅Π»Ρ‹Ρ… чисСл

int (*p)[4] = ia; // p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл

p = &ia[2];       // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° послСдний элСмСнт ia

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 3.5.1, Π½Π°Ρ‡Π½Π΅ΠΌ рассмотрСниС с части (*p), гласящСй, Ρ‡Ρ‚ΠΎ p β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Глядя Π²ΠΏΡ€Π°Π²ΠΎ, Π·Π°ΠΌΠ΅Ρ‡Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ 4 элСмСнта, Π° глядя Π²Π»Π΅Π²ΠΎ, Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΎΠΌ элСмСнта являСтся int. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, p β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл.

ΠšΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Π² этом объявлСнии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

int *ip[4];   // массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° int

int (*ip)[4]; // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл

Новый стандарт Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСобходимости ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ указатСля Π½Π° массив Π·Π° счСт использования спСцификаторов auto ΠΈ decltype (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.2).

// вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ia; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ массив

// отобраТаСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС

// p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл

for (auto p = ia; p != ia + 3; ++p) {

 // q ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл;

 // Ρ‚.Π΅. q ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° int

 for (auto q = *p; q != *p + 4; ++q)

  cout << *q << ' '; cout << endl;

}

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ†ΠΈΠΊΠ» for начинаСтся с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ указатСля p адрСсом ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ массива Π² массивС ia. Π­Ρ‚ΠΎΡ‚ Ρ†ΠΈΠΊΠ» продолТаСтся, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ всС Ρ‚Ρ€ΠΈ ряда массива ia. Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ++p ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ряд (Ρ‚.Π΅. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт) массива ia.

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» for Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… массивов. Он начинаСтся с создания указатСля q Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π² массивС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ *p Π±ΡƒΠ΄Π΅Ρ‚ массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ использовании ΠΈΠΌΠ΅Π½ΠΈ массива ΠΎΠ½ΠΎ автоматичСски прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» for выполняСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ массивС. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° элСмСнт сразу Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ массива, ΠΌΡ‹ снова обращаСмся ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ указатСля p, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π² этом массивС. Π—Π°Ρ‚Π΅ΠΌ добавляСм ΠΊ Π½Π΅ΠΌΡƒ 4, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ элСмСнта Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ массивС.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ begin() ΠΈ end() (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.3), этот Ρ†ΠΈΠΊΠ» ΠΌΠΎΠΆΠ½ΠΎ сущСствСнно ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ:

// p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ массив Π² ia

for (auto p = begin(ia); p != end(ia); ++p) {

 // q ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ массивС

 for (auto q = begin(*p); q != end(*p); ++q)

  cout << *q << ' '; // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ q

 cout << endl;

}

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ auto позволяСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ функция begin(). Π’ΠΎ внСшнСм Ρ†ΠΈΠΊΠ»Π΅ этот Ρ‚ΠΈΠΏ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл. Π’ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅ этот Ρ‚ΠΈΠΏ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ int.

ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы

ПсСвдоним Ρ‚ΠΈΠΏΠ° (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1) ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ большС ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, написаниС ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

using int_array = int[4]; // объявлСниС псСвдонима Ρ‚ΠΈΠΏΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ стиля;

                          // см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1

typedef int int_array[4]; // эквивалСнтноС объявлСниС typedef;

                          // см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1

// вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ia; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ массив

// отобраТаСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС

for (int_array *p = ia; p != ia + 3; ++p) {

 for (int *q = *p; q != *p + 4; ++q)

  cout << *q << ' ';

 cout << endl;

}

Код начинаСтся с опрСдСлСния int_array ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½ΠΈ для Ρ‚ΠΈΠΏΠ° "массив ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл". Π­Ρ‚ΠΎ имя Ρ‚ΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ внСшнСго Ρ†ΠΈΠΊΠ»Π° for.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 3.6

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.43. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для Π²Ρ‹Π²ΠΎΠ΄Π° элСмСнтов массива ia. Одна вСрсия Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для управлСния ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ сСрийный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ for, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π²Π΅ β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» for, Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСксированиС, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. Π’ΠΎ всСх Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΠΈΡˆΠΈΡ‚Π΅ всС Ρ‚ΠΈΠΏΡ‹ явно, Ρ‚.Π΅. Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ псСвдонимы Ρ‚ΠΈΠΏΠΎΠ² ΠΈ спСцификаторы auto ΠΈΠ»ΠΈ decltype для упрощСния ΠΊΠΎΠ΄Π°.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.44. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ упраТнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ псСвдоним для Ρ‚ΠΈΠΏΠ° ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.45. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ снова, Π½Π° сСй Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ спСцификатор auto.

РСзюмС

Одними ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ vector ΠΈ string. Π‘Ρ‚Ρ€ΠΎΠΊΠ° β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ β€” ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ косвСнный доступ ΠΊ хранящимся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для доступа ΠΈ пСрСмСщСния ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами Π² строках ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°Ρ….

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° элСмСнты массива ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² vector ΠΈ string. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ классы, Π° Π½Π΅ ΠΈΡ… Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, массивы ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, встроСнныС Π² язык.

Π’Π΅Ρ€ΠΌΠΈΠ½Ρ‹

АрифмСтичСскиС дСйствия с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (iterator arithmetic). ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ строк. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ измСнСнию ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ количСство элСмСнтов Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄ ΠΎΡ‚ исходного. Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π΄ΠΈΡΡ‚Π°Π½Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. АрифмСтичСскиС дСйствия допустимы лишь для ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², относящихся ΠΊ элСмСнтам Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.