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

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

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

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ map ΠΈ unordered_map ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ at() (см. Ρ€Π°Π·Π΄Π΅Π» 9.3.2), прСдставлСнныС Π² Ρ‚Π°Π±Π». 11.6. Π’ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² set Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π°Π±ΠΎΡ€Π΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ "значСния", связанного с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ сами ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, поэтому опСрация "доступа ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, связанному с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ", бСссмыслСнна. НСльзя ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ multimap ΠΈΠ»ΠΈ unordered_multimap, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ассоциировано нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.


Π’Π°Π±Π»ΠΈΡ†Π° 11.6. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ индСксирования ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² map ΠΈ unordered_map

c[k] Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ элСмСнт с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ k; Ссли ΠΊΠ»ΡŽΡ‡Π° k Π½Π΅Ρ‚ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с, добавляСтся Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ k c.at(k) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ элСмСнта с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ k; Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ out_of_range (см. Ρ€Π°Π·Π΄Π΅Π» 5.6)

Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ индСксирования, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования ΠΊΠ°Ρ€Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ индСкс (Ρ‚.Π΅. ΠΊΠ»ΡŽΡ‡) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ связанноС с Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² индСксирования, Ссли Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π΅Ρ‰Π΅ Π½Π΅Ρ‚, создаСтся Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт ΠΈ добавляСтся Π² ΠΊΠ°Ρ€Ρ‚Ρƒ для Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. АссоциированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.1).

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

map <string, size_t> word_count; // пустая ΠΊΠ°Ρ€Ρ‚Π°

// Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ элСмСнт

// с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Anna; Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для Π½Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1

word_count["Anna"] = 1;

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ мСсто ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий.

β€’ Π’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ word_count происходит поиск элСмСнта с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Anna. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½.

β€’ Π’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ word_count добавляСтся новая ΠΏΠ°Ρ€Π° ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΠ»ΡŽΡ‡ (константная строка) содСрТит тСкст Anna. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ инициализируСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½ΡƒΠ»Π΅ΠΌ.

β€’ Π’Π½ΠΎΠ²ΡŒ созданному элСмСнту присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования способСн Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнт, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ°Ρ€Ρ‚Ρ‹, которая Π½Π΅ являСтся константной.

Π˜Π½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡ ΠΊΠ°Ρ€Ρ‚ сущСствСнно отличаСтся ΠΎΡ‚ индСксации массивов ΠΈΠ»ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²: использованиС ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ добавлСнию элСмСнта с Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² ΠΊΠ°Ρ€Ρ‚Ρƒ.

ИспользованиС значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ индСксирования

Иной способ индСксирования ΠΊΠ°Ρ€Ρ‚, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² индСксирования, влияСт Π½Π° Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚ΠΈΠΏ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ обращСния ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈ Ρ‚ΠΈΠΏ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ индСксирования, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚. Π£ ΠΊΠ°Ρ€Ρ‚ всС Π½Π΅ Ρ‚Π°ΠΊ: ΠΏΡ€ΠΈ индСксировании возвращаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° mapped_type, Π° ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°Ρ€Ρ‚Ρ‹ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° value_type (см. Ρ€Π°Π·Π΄Π΅Π» 11.3).

ΠžΠ±Ρ‰ΠΈΠΌ Ρƒ всСх ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² индСксирования являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (см. Ρ€Π°Π·Π΄Π΅Π» 4.1.1). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ возвращаСтся l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π² элСмСнт:

cout << word_count["Anna"]; // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ элСмСнт ΠΏΠΎ индСксу Anna;

                            // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 1

++word_count["Anna"];       // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ элСмСнт ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ 1

cout << word_count["Anna"]; // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ элСмСнт ΠΈ вывСсти Π΅Π³ΠΎ;

                            // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 2

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ строки, Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ индСксирования ΠΊΠ°Ρ€Ρ‚Ρ‹, отличаСтся ΠΈΠ· Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°Ρ€Ρ‚Ρ‹.

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ индСксированиС добавляСт элСмСнт, Ссли ΠΊΠ°Ρ€Ρ‚Π° Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π½Π΅ содСрТит, позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сТатый ΠΊΠΎΠ΄, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ» Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ подсчСта слов (см. Ρ€Π°Π·Π΄Π΅Π» 11.1). Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, присутствуСт Π»ΠΈ элСмСнт, Π½ΠΎ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² случаС отсутствия. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.24. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°?

map<int, int> m;

m[0] = 1;

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.25. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ:

vector<int> v;

v[0] = 1;

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.26. Какой Ρ‚ΠΈΠΏ примСняСтся ΠΏΡ€ΠΈ индСксировании ΠΊΠ°Ρ€Ρ‚Ρ‹? Какой Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования? ΠŸΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚.Π΅. создайтС ΠΊΠ°Ρ€Ρ‚Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ для Π΅Π΅ индСксирования, Π° Π·Π°Ρ‚Π΅ΠΌ выявитС Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования.

11.3.5. Доступ ΠΊ элСмСнтам

АссоциативныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы поиска Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… элСмСнтов, описанныС Π² Ρ‚Π°Π±Π». 11.7. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ способ зависит ΠΎΡ‚ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Если Π½ΡƒΠΆΠ½ΠΎ лишь Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, находится Π»ΠΈ Π½Π΅ΠΊΠΈΠΉ элСмСнт Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Ρ‚ΠΎ, вСроятно, Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find(). Для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², способных ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ, вСроятно, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ функция find() ΠΈΠ»ΠΈ count(). Но для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² с Π½Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ функция count() выполняСт большС Ρ€Π°Π±ΠΎΡ‚Ρ‹: Ссли элСмСнт присутствуСт, Π΅ΠΉ всС Π΅Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство элСмСнтов с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Если Π·Π½Π°Ρ‚ΡŒ количСство Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find():

set<int> iset = {0,1,2,3,4,5,6,7,8,9};

iset.find(1);   // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° элСмСнт с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ == 1

iset.find(11);  // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ == iset.end()

iset.count(1);  // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1

iset.count(11); // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0


Π’Π°Π±Π»ΠΈΡ†Π° 11.7. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска элСмСнтов Π² ассоциативном ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ lower_bound() ΠΈ upper_bound() Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ для нСупорядочСнных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования ΠΈ функция at() ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Π΅Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² map ΠΈ unordered_map, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами. c.find(k) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ) элСмСнт с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ k ΠΈΠ»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ послС ΠΊΠΎΠ½Ρ†Π°, Ссли Ρ‚Π°ΠΊΠΎΠ³ΠΎ элСмСнта Π½Π΅Ρ‚ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ c.count(k) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство элСмСнтов с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ k. Для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСгда Π½ΡƒΠ»ΡŒ ΠΈΠ»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° c.lower_bound(k) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ мСньшС, Ρ‡Π΅ΠΌ k c.upper_bound(k) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ большС, Ρ‡Π΅ΠΌ k c.equal_range(k) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΡ… элСмСнты с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ k. Если Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π½Π΅Ρ‚, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Π΅ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² Ρ€Π°Π²Π½ΠΎ c.end() ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find() вмСсто индСксирования ΠΊΠ°Ρ€Ρ‚

Для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² map ΠΈ unordered_map ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования прСдставляСт ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ поиска значСния. Но, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° индСксированиС Π΅ΡΡ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΉ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт: Ссли искомого ΠΊΠ»ΡŽΡ‡Π° Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π² ΠΊΠ°Ρ€Ρ‚Π΅, индСксированиС добавляСт элСмСнт с Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Насколько ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, зависит ΠΎΡ‚ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π². ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° подсчСта слов полагалась Π½Π° Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ использованиС Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΏΡ€ΠΈ индСксировании ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ вставкС элСмСнта с этим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0.

Иногда ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π½Π°Ρ‚ΡŒ, присутствуСт Π»ΠΈ элСмСнт с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Π½Π΅ измСняя ΠΊΠ°Ρ€Ρ‚Ρƒ. НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования для опрСдСлСния наличия элСмСнта, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π΅Π³ΠΎ отсутствии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт с Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find():

if (word_count.find("foobar") == word_count.end())

 cout << "foobar is not in the map" << endl;

Поиск элСмСнтов Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… multimap ΠΈ multiset

Поиск элСмСнта Π² ассоциативном ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ довольно прост β€” элСмСнт Π»ΠΈΠ±ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Π»ΠΈΠ±ΠΎ Π½Π΅Ρ‚. Для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² с Π½Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ всС нСсколько слоТнСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ нСсколько элСмСнтов с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Когда Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ multimap ΠΈΠ»ΠΈ multiset содСрТится нСсколько элСмСнтов с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΎΠ½ΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ рядом.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ, имСя ΠΊΠ°Ρ€Ρ‚Ρƒ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΈΡ… ΠΊΠ½ΠΈΠ³, слСдуСт вывСсти всС ΠΊΠ½ΠΈΠ³ΠΈ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡ€Π°. Π­Ρ‚Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ трСмя способами. Π‘Π°ΠΌΡ‹ΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find() ΠΈ count():