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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС STLΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 50

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ΅ΠΉΠ΅Ρ€Ρ

ΠžΡ‡Π΅Π½ΡŒ просто. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ критСриями Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ простота.

Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° поиска ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Ρ‹ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Π‘Π»ΡƒΡ‡Π°ΠΉ с поиском Π²ΠΎ всСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π½ΠΈΠΆΠ΅.

ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ стратСгии поиска ΠΌΠ½ΠΎΠ³ΠΎΠ΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сортированный ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π». Если это условиС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ binary_search, lower_bound, upper_bound ΠΈ equal_range для провСдСния быстрого поиска (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с логарифмичСской ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ β€” см. совСт 34). Если ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π½Π΅ отсортирован, Π²Ρ‹Π±ΠΎΡ€ ограничиваСтся Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ count, count_if, find ΠΈ find_if. Π’ дальнСйшСм описании _if-вСрсии Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² count ΠΈ find ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ ΠΈ разновидности binary_search, lower_bound, upper_bound ΠΈ equal_range, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ пСрСдаСтся ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚. Алгоритм поиска выбираСтся ΠΏΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ сообраТСниям нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ стандартный ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π΅Ρ‚Π΅ свой собствСнный.

Π˜Ρ‚Π°ΠΊ, Π² нСсортированных ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°Ρ… Π²Ρ‹Π±ΠΎΡ€ ограничиваСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ count ΠΈ find. Π­Ρ‚ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ нСсколько ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ ΠΏΠΎΠ²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅. Алгоритм count ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° вопрос: Β«ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ Ссли присутствуСт β€” Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΌ количСствС экзСмпляров?Β». Для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° find вопрос Π·Π²ΡƒΡ‡ΠΈΡ‚ Ρ‚Π°ΠΊ: Β«ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ Ссли присутствуСт β€” Ρ‚ΠΎ Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ?Β»

Допустим, Π²Ρ‹ просто Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, присутствуСт Π»ΠΈ Π² спискС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ w класса Widget. ΠŸΡ€ΠΈ использовании Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° count Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ выглядит Ρ‚Π°ΠΊ:

list<Widget> lw;// Бписок ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget

Widget w;// ИскомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ класса Widget

if (count(lw.begin().lw.end(),w)){

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ w присутствуСт Π² lw

} else {

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

}

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ продСмонстрирована стандартная ΠΈΠ΄ΠΈΠΎΠΌΠ°: ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ count для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сущСствования. Алгоритм count Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ ноль, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число; Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ логичСская истина, Π° ноль β€” ΠΊΠ°ΠΊ логичСская лоТь. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ конструкция Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΡƒΡ‚ΡŒ происходящСго:

if (count(lw.begin().lw.end(),w)!=0)...

НСкоторыС программисты ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ эту запись, Π½ΠΎ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, встрСчаСтся достаточно часто.

РСшСниС с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ find выглядит Ρ‡ΡƒΡ‚ΡŒ слоТнСС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ приходится ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ списка:

if(find(lw.begin(), lw.end(),w) !=w.end()){

...

} else {

...

}

Π’ контСкстС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сущСствования идиоматичСскоС использованиС count Ρ‡ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅ кодируСтся. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΎΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Π½Π΅Π΅ эффСктивно ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ поискС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ find ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ искомого значСния Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ поиск, a count ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ экзСмпляры Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° программистов Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² эффСктивности компСнсируСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ…Π»ΠΎΠΏΠΎΡ‚Ρ‹, связанныС с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ find.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, простой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сущСствования Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π±Ρ‹Π²Π°Π΅Ρ‚ нСдостаточно; трСбуСтся Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. НапримСр, этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ вывСсти, Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ (ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π² процСссС ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° рассматриваСтся Π² совСтС 9). Если трСбуСтся ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹) ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ find:

list<Widget>::iterator i = find(lw.begin(),lw.end(),w);

if (i!=lw.end()){

// Π£ΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ поиск, i ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр

} else {

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

}

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с сортированными ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°ΠΌΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, ΠΈ ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ стоит ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅. Алгоритмы count ΠΈ find Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска Π² сортированных ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°Ρ… (binary_search, lower_bound, upper_bound ΠΈ equal_range) ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ логарифмичСской ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ нСсортированных ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² ΠΊ сортированным Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ критСрия сравнСния Π΄Π²ΡƒΡ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½. Различия ΠΌΠ΅ΠΆΠ΄Ρƒ критСриями ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описаны Π² совСтС 19, поэтому я Π½Π΅ стану ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ ΠΈ Π·Π°ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ count ΠΈ find ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ равСнства, Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ binary_search, lower_bound, upper_bound ΠΈ equal range основаны Π½Π° ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ эквивалСнтности.

ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π² сортированном ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ провСряСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ binary_search. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bsearch ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ (Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘++), Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ binary_search Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ bool. Алгоритм ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° вопрос: Β«ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅?Β», ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΠΎΡ‚Π²Π΅Ρ‚Π°: Β«Π΄Π°Β» ΠΈ Β«Π½Π΅Ρ‚Β». Если Π²Π°ΠΌ понадобится Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ примСнСния binary_search ΠΊ сортированному Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ (прСимущСства сортированных Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² описаны Π² совСтС 23):

vector<Widget> vw;

sort (vw. Begin(),vw.end());

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€, Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ // Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Widget w:// ИскомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

if(binary_search(vw.begin().vw.end(),w)) {

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ w присутствуСт Π² vw

} else {

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

}

Если Ρƒ вас имССтся сортированный ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΈ Π²Ρ‹ ΠΈΡ‰Π΅Ρ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос: Β«ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅, ΠΈ Ссли присутствуСт β€” Ρ‚ΠΎ Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ?Β», слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ equal_range, хотя Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ lower_bound. ВскорС ΠΌΡ‹ вСрнСмся ΠΊ equal_range, Π° ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ поиск Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°Ρ… с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° lower_bound.

ΠŸΡ€ΠΈ поискС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ lower_bound Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр этой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ (Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ поиска) ΠΈΠ»ΠΈ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ вставки (Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ lower_bound ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° вопрос: Β«ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅? Если присутствуСт, Ρ‚ΠΎ Π³Π΄Π΅ находится ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр, Π° Ссли Π½Π΅Ρ‚ β€” Π³Π΄Π΅ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ?Β». Как ΠΈ Π² случаС с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ find, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ lower_ bound Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Но Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ find, Π΅Π³ΠΎ нСльзя просто ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ. ВмСсто этого приходится Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ lower_bound, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, содСрТит Π»ΠΈ ΠΎΠ½ искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

МногиС программисты ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ lower_bound ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

vector<Widget>::iterator =lower_bound(vw,begin().vw.end(),w):

if (i!=vw.end()&&*i=w){// Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ i ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚

// Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ искомоС

// Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Ошибка!!!!

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, i ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ

// экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с этим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ

} else {

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

}

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв такая конструкция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½Π° содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ. ΠŸΡ€ΠΈΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ΡΡŒ ΠΊ провСряСмому ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ:

if (i!=vw.end()&&*i=w){

Π’ этом условии провСряСтся равСнство, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ lower_bound ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈ поискС ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ эквивалСнтности. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠΎ Π΄Π²ΡƒΠΌ критСриям ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² совСтС 19, это Π½Π΅ всСгда Ρ‚Π°ΠΊ. Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ lower__bound, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, эквивалСнтным искомому. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (Π² совСтС 19 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ это дСлаСтся, Π° Π² совСтС 24 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ситуации, ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ), ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это нСпросто, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π° ΠΆΠ΅ функция сравнСния, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ lower_bound. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ

Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ lower_bound Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния эта ΠΆΠ΅ функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π² Β«Ρ€ΡƒΡ‡Π½ΠΎΠΉΒ» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ эквивалСнтности; ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ lower_rbound, Π²Π°ΠΌ придСтся внСсти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ эквивалСнтности. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ слоТно, Π½ΠΎ ΠΎΠ± этом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ…Π»ΠΎΠΏΠΎΡ‚ ΠΈ Π±Π΅Π· этого Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚.

БущСствуСт простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ equal_range. Алгоритм Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²; ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ совпадаСт с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ lower_bound, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ совпадаСт с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ upper_bound (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, эквивалСнтных искомому). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ equal_range Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, эквивалСнтных искомому. Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, имя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π²Ρ‹Π±Ρ€Π°Π½ΠΎ довольно ΡƒΠ΄Π°Ρ‡Π½ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ equvalent_range, Π½ΠΎ ΠΈ equal _range воспринимаСтся Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ.

ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния equal_range Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… замСчания. Если Π΄Π²Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, это Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» пуст, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ. По этому Ρ„Π°ΠΊΡ‚Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Π±Ρ‹Π»ΠΎ Π»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ совпадСниС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

vector<Widget> vw;

sort (vw.begin(), v.end());

typedef vector<Widget>::iterator VWIter; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅

typedef pair<VWIter,VWIter> VWIterPair: // опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ²