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

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

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

АссоциативныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ. Но ассоциативныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±Ρ‰ΠΈΡ… для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ассоциативных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Различия Π² функциях ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ способ использования ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² ассоциативных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ….

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ упорядочСнных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ доступ ΠΊ элСмСнтам ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ хранятся рядом Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΈ Π² упорядочСнных, ΠΈ Π² нСупорядочСнных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ….

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

Ассоциативный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (associative container). Π’ΠΈΠΏ, содСрТащий ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ эффСктивный поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

Ассоциативный массив (associative array). Массив, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ проиндСксированы ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, Π° Π½Π΅ ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, массив сопоставляСт (ассоциируСт) ΠΊΠ»ΡŽΡ‡ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ map (ΠΊΠ°Ρ€Ρ‚Π°). Ассоциативный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ассоциативному массиву. Подобно Ρ‚ΠΈΠΏΡƒ vector, Ρ‚ΠΈΠΏ map являСтся шаблоном класса. Но ΠΏΡ€ΠΈ создании ΠΊΠ°Ρ€Ρ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: Ρ‚ΠΈΠΏ ΠΊΠ»ΡŽΡ‡Π° ΠΈ Ρ‚ΠΈΠΏ связанного с Π½ΠΈΠΌ значСния. Π’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ map ΠΊΠ»ΡŽΡ‡ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹, ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ связан с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°Ρ€Ρ‚Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° pair, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит константный ΠΊΠ»ΡŽΡ‡ ΠΈ связанноС (ассоциированноС) с Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ multimap. Ассоциативный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ map, Π½ΠΎ способный ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ multiset. Ассоциативный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΡŽΡ‡ΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π°Π±ΠΎΡ€Π°, способСн ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ set (Π½Π°Π±ΠΎΡ€). Ассоциативный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΡŽΡ‡ΠΈ. ΠšΠ»ΡŽΡ‡ΠΈ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ set Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ unordered_map. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Допустим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт Π½Π° ΠΊΠ»ΡŽΡ‡.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ unordered_multimap. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Допустимо нСсколько элСмСнтов Π½Π° ΠΊΠ»ΡŽΡ‡.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ unordered_multiset. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, хранящий ΠΊΠ»ΡŽΡ‡ΠΈ. Допустимо нСсколько элСмСнтов Π½Π° ΠΊΠ»ΡŽΡ‡.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ unordered_set. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, хранящий ΠΊΠ»ΡŽΡ‡ΠΈ. Допустим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт Π½Π° ΠΊΠ»ΡŽΡ‡.

НСупорядочСнный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (unordered container). АссоциативныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π° Π½Π΅ сравнСниС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ для хранСния ΠΈ доступа ΠΊ элСмСнтам. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ этих ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² зависит ΠΎΡ‚ качСства Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ *. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ обращСния ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° map, set, multimap ΠΈΠ»ΠΈ multiset, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° value_type. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΎΠΌ value_type ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° map ΠΈ multimap являСтся ΠΏΠ°Ρ€Π° (pair).

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ []. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ map, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ индСкс, Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ key_type (ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½Π΅Π³ΠΎ). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° mapped_type.

Π‘Ρ‚Ρ€ΠΎΠ³ΠΎΠ΅ сравнСниС (strict weak ordering). ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ассоциативного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠŸΡ€ΠΈ строгом сравнСнии ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° Π»ΡŽΠ±Ρ‹Ρ… значСния ΠΈ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… мСньшС. Если Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅ мСньшС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ.

Π’ΠΈΠΏ key_type. Π’ΠΈΠΏ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² шаблонС ассоциативного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ соотвСтствуСт Ρ‚ΠΈΠΏ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для сохранСния ΠΈ возвращСния значСния. Π£ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° map Ρ‚ΠΈΠΏ key_type ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для индСксации. Π£ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° set Ρ‚ΠΈΠΏΡ‹ key_type ΠΈ value_type ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

Π’ΠΈΠΏ mapped_type. Π’ΠΈΠΏ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ассоциативных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² map ΠΈ multimap, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ соотвСтствуСт Ρ‚ΠΈΠΏ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π’ΠΈΠΏ pair (ΠΏΠ°Ρ€Π°). Π’ΠΈΠΏ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ содСрТит Π΄Π²Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ first (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ) ΠΈ second (Π²Ρ‚ΠΎΡ€ΠΎΠΉ). Π’ΠΈΠΏ pair являСтся шаблоном, ΠΏΡ€ΠΈ создании класса ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΈΠΏ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта.

Π’ΠΈΠΏ value_type. Π’ΠΈΠΏ элСмСнта, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Π£ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² set ΠΈ multiset Ρ‚ΠΈΠΏΡ‹ value_type ΠΈ key_type ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚. Π£ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² map ΠΈ multimap этот Ρ‚ΠΈΠΏ прСдставляСт собой ΠΏΠ°Ρ€Ρƒ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ (first) ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const key_type, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ (second) β€” Ρ‚ΠΈΠΏ mapped_type.

Π₯Сш (hash). Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ нСупорядочСнныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ для управлСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ элСмСнтов.

Π₯Сш-функция (hash function). Ѐункция, ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ значСния Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° с цСлочислСнными значСниями (size_t). Π Π°Π²Π½Ρ‹Π΅ значСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ с Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами; Π½Π΅Ρ€Π°Π²Π½Ρ‹Π΅ значСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ с Π½Π΅Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Ρ†Π΅Π»Ρ‹ΠΌ числами, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π“Π»Π°Π²Π° 12

ДинамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ

НаписанныС Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ использовали ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, имСвшиС Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сущСствования. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ автоматичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ. БтатичСскиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ использованиСм ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ автоматичСским ΠΈ статичСским ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ язык Π‘++ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ динамичСски. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сущСствования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², созданных динамичСски, Π½Π΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ ΠΎΠ½ΠΈ созданы; ΠΎΠ½ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ освобоТдСны явно.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ освобоТдСния динамичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² оказываСтся ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΌ источником ошибок. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ использованиС динамичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² бСзопаснСй, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… динамичСским созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски освобоТдСны Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Π”ΠΎ сих ΠΏΠΎΡ€ наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ использовали Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, располагаСмыС Π² стСкС. БтатичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (см. Ρ€Π°Π·Π΄Π΅Π» 6.1.1), для статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² классов (см. Ρ€Π°Π·Π΄Π΅Π» 7.6), Π° Ρ‚Π°ΠΊΠΆΠ΅ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘Ρ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для нСстатичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² функциях. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, располоТСнныС Π² статичСской памяти ΠΈΠ»ΠΈ Π² стСкС, автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ компилятором. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· стСка ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΊΠ° выполняСтся Π±Π»ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹; статичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹, ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠšΡ€ΠΎΠΌΠ΅ статичСской памяти ΠΈ стСка, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡƒΠ» памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ динамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ (free store) ΠΈΠ»ΠΈ распрСдСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ (heap). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… динамичСски созданными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ (dynamically allocated object), мСсто для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎ врСмя выполнСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сама ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сущСствования динамичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²; наш ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ явно ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.

Π₯отя динамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°, Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ освобоТдСниС Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ довольно слоТно.

12.1. ДинамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

Для управлСния динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² языкС Π‘++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ (Π° ΠΏΡ€ΠΈ нСобходимости ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² динамичСской памяти ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π³ΠΎ; ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ удаляСт Π΅Π³ΠΎ, освобоТдая Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π Π°Π±ΠΎΡ‚Π° с динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ слоТно Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ освобоТдСниС памяти Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Если Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‚ΠΎ появится ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти, Ссли ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти слишком Ρ€Π°Π½ΠΎ, ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½Π΅Π΅, Ρ‚ΠΎ получится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ использованиС динамичСской памяти ΠΏΡ€ΠΎΡ‰Π΅ (ΠΈ бСзопасный), новая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдоставляСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (smart pointer) для управлСния динамичСскими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ дСйствуСт, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½ΠΎ с Π²Π°ΠΆΠ½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ: автоматичСски удаляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Новая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ способом управлСния своими Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ указатСлями: ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr позволяСт нСскольким указатСлям ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ unique_ptr β€” Π½Π΅Ρ‚. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс weak_ptr, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ второстСпСнной ссылкой Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, управляСмый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ shared_ptr. ВсС Ρ‚Ρ€ΠΈ класса ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ memory.