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

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

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

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ контСксты

Π’ совСтС 35 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° рСализация сравнСния строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра символов с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² mismatch ΠΈ lexicographical_compare, Π½ΠΎ Π² Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст. Книга посвящСна STL, Π° Π½Π΅ вопросам ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, поэтому Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ контСкстам Π² Π½Π΅ΠΉ Π½Π΅ нашлось мСста. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠœΡΡ‚Ρ‚ ΠžΡΡ‚Π΅Ρ€Π½, Π°Π²Ρ‚ΠΎΡ€ ΠΊΠ½ΠΈΠ³ΠΈ Β«Generic Programming and the STLΒ» [4], посвятил этой Ρ‚Π΅ΠΌΠ΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π² майском Π½ΠΎΠΌΠ΅Ρ€Π΅ ΠΆΡƒΡ€Π½Π°Π»Π° Β«C++ ReportΒ» [11]. ВСкст этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² настоящСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π― Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ ΠœΡΡ‚Ρ‚Ρƒ ΠΈ Ρ„ΠΈΡ€ΠΌΠ΅ 101communications Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΌΠ½Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра символов

ΠœΡΡ‚Ρ‚ ΠžΡΡ‚Π΅Ρ€Π½

Если Π²Π°ΠΌ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ доводилось ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ строки (Π° ΠΊΠΎΠΌΡƒ, ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ, Π½Π΅ доводилось?), скорСС всСго, Π²Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ с Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ ситуациСй β€” Π΄Π²Π΅ строки, Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ рСгистром символов, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π²Π½Ρ‹Π΅. Π’ этих случаях Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° равСнства, большС-мСньшС, Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ подстрок, сортировка β€” ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ рСгистр символов. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ часто ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ срСдствами стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C++. На этот вопрос сущСствуСт ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Π²Π΅Ρ€Π½Ρ‹.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ мысли ΠΎ написании класса, ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ строки Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра. Π”Π°, с тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния это Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’ΠΈΠΏ std::string стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ являСтся синонимом для Ρ‚ΠΈΠΏΠ° std::basic_string<char, std::char_trais<char>, std::allocator<char> >. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ; пСрСдавая Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ опСрациями Β«Ρ€Π°Π²Π½ΠΎΒ» ΠΈ «мСньшС», ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ basic_string Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ < ΠΈ = Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСгистр символов. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΈΠ³Ρ€Π° Π½Π΅ стоит свСч.

β€’ Π’Ρ‹ Π½Π΅ смоТСтС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ это ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ…Π»ΠΎΠΏΠΎΡ‚. ΠšΠ»Π°ΡΡΡ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ std::basic_istream ΠΈ std::basic_ostream) ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Π΄Π²ΡƒΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ std::basic_string (Π° std::ostream всСго лишь являСтся синонимом для std::basic_ostream<char, char_traits<char> >). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ характСристик (traits) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ строки Ρ‚ΠΈΠΏΠ° std::basic_string<char, my_traits_class>, Ρ‚ΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° строк Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΈΠΏ std::basic_ostream<char, my_traits_class>. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ cin ΠΈ cout для этой Ρ†Π΅Π»ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚.

β€’ Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСгистра символов являСтся Π½Π΅ свойством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° лишь контСкстом Π΅Π³ΠΎ использования. Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ контСкстС строки Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ рСгистра, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ контСкстС рСгистр Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ установкС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ).

β€’ Π Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ соотвСтствуСт ΠΊΠ°Π½ΠΎΠ½Π°ΠΌ. Класс char_traits, ΠΊΠ°ΠΊ ΠΈ всС классы характСристик[5], прост, ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π΅Π½ ΠΈ Π½Π΅ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ состояния. Как Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ рСализация сравнСний Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· этих ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π².

β€’ Π­Ρ‚ΠΎΠ³ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ достаточно. Π”Π°ΠΆΠ΅ Ссли всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ basic_string Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСгистр, это Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отразится Π½Π° использовании Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ std::search ΠΈ std::find_end. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ пСрСстаСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ссли ΠΏΠΎ сообраТСниям эффСктивности ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² basic_string ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ строк.

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

std::sort(C.begin(), C.end().compare_without_case);

Написанию Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ посвящСна эта ΡΡ‚Π°Ρ‚ΡŒΡ.

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°

БущСствуСт нСсколько способов упорядочСния слов ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ. Π—Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΊΠ½ΠΈΠΆΠ½Ρ‹ΠΉ ΠΌΠ°Π³Π°Π·ΠΈΠ½ ΠΈ посмотритС, ΠΊΠ°ΠΊ расставлСны ΠΊΠ½ΠΈΠ³ΠΈ Π½Π° ΠΏΠΎΠ»ΠΊΠ°Ρ…. ΠŸΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π»ΠΈ имя

1. Π‘ΠΌ. ΡΡ‚Π°Ρ‚ΡŒΡŽ АлСксандрСску А. (Andrei Alexandrescu) Π² майском Π½ΠΎΠΌΠ΅Ρ€Π΅ Β«C++ ReportΒ» Π·Π° 2000 Π³. [19].

Mary McCarthy ΠΈΠΌΠ΅Π½ΠΈ Bernard Malamud ΠΈΠ»ΠΈ слСдуСт послС Π½Π΅Π³ΠΎ? (Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это лишь вопрос ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠΈ, я встрСчал ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°.) Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ сравнСния строк Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌ Π½Π°ΠΌ ΠΏΠΎ школС: Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ лСксикографичСском, ΠΈΠ»ΠΈ «словарном», сравнСнии, основанном Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ сравнСний ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… символов Π΄Π²ΡƒΡ… строк.

ЛСксикографичСский ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ сравнСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСподходящим для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… спСцифичСских ситуаций. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ критСрия Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ сущСствуСт β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠ΅Π½Π° людСй ΠΈ гСографичСскиС названия ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ критСриям. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв лСксикографичСский ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, поэтому ΠΎΠ½ Π±Ρ‹Π» Π·Π°Π»ΠΎΠΆΠ΅Π½ Π² основу ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° строковых сравнСний Π² C++. Π‘Ρ‚Ρ€ΠΎΠΊΠ° прСдставляСт собой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов. Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ x ΠΈ y относятся ΠΊ Ρ‚ΠΈΠΏΡƒ std::string, Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ x<y эквивалСнтно Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ

std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end())

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ lexicographical_compare сравниваСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ символы ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ <, ΠΎΠ΄Π½Π°ΠΊΠΎ сущСствуСт другая вСрсия lexicographical_compare, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ сравнСния символов. Она вызываСтся с ΠΏΡΡ‚ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ вмСсто Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…; Π² послСднСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ пСрСдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… символов ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для сравнСния строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра Π½Π° Π±Π°Π·Π΅ lexicographical_compare достаточно ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ различия Π² рСгистрС символов.

РаспространСнный ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ сравнСния Π΄Π²ΡƒΡ… символов Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° символа ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° этой ΠΈΠ΄Π΅ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C++ с использованиСм Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ toupper ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C:

struct lt_nocase:

 public std::binary_function<char, char, bool> {

 bool operator()(char x, char y) const {

  return std::toupper(static_cast<unsigned char>(x))<

   std::toupper(static_cast<unsigned char>(y));

 }

};

Β«Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ слоТной Π·Π°Π΄Π°Ρ‡ΠΈ Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ простоС, элСгантноС и… Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅Β». Авторы ΠΊΠ½ΠΈΠ³ C++ ΠΎΠ±ΠΎΠΆΠ°ΡŽΡ‚ этот класс Π·Π° простоту ΠΈ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡ‚ΡŒ. Π― Ρ‚ΠΎΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ использовал Π΅Π³ΠΎ Π² своих ΠΊΠ½ΠΈΠ³Π°Ρ…. Он ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½, ΠΈ всС-Ρ‚Π°ΠΊΠΈ Π½Π΅ совсСм, хотя нСдостаток вСсьма Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π΅Π½. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выявляСт этот нСдостаток:

int main() {

 const char* s1 = "GEW\334RZTRAMINER";

 const char* s2 = "gew\374rztraminer";

 printf("s1=%s, s2=%s\n", s1, s2);

 printf("s1<s2:%s\n",

  std::lexicographical_compare(s1, s1+14, s2, s2+14, lt_nocase())

  ?"true":"false");

}

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² своСй систСмС. На ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ (Silicon Graphics О2 с систСмой IRIX 6.5) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выглядСл Ρ‚Π°ΠΊ:

s1=GEWÜRZTRAMINER,s2=gewürztraminer

s1<s2:true

Бтранно… Π Π°Π·Π²Π΅ ΠΏΡ€ΠΈ сравнСнии Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра Β«GEWÜRZTRAMINERΒ» ΠΈ Β«gewΓΌrztraminerΒ» Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ? И Π΅Ρ‰Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с нСбольшой ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ: Ссли ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ printf Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ строку

setlocale(LC_ALL, "de");

Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ измСняСтся:

s1=GEWÜRZTRAMINER,s2=gewürztraminer

s1<s2:false

Π—Π°Π΄Π°Ρ‡Π° сравнСния строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра слоТнСС, Ρ‡Π΅ΠΌ каТСтся сначала. Π Π°Π±ΠΎΡ‚Π° элСмСнтарной Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ стСпСни зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΎ Ρ‡Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· нас ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π»ΠΈ Π±Ρ‹ Π·Π°Π±Ρ‹Ρ‚ΡŒ. Π Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ локальном контСкстС.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст

Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ char Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прСдставляСтся самым ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом. Π­Ρ‚ΠΎ число ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ символ, Π½ΠΎ такая интСрпрСтация Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ являСтся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ. Π§Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ числу β€” Π±ΡƒΠΊΠ²Π°, Π·Π½Π°ΠΊ прСпинания, Π½Π΅ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌΡ‹ΠΉ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ символ?

На этот вопрос Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π±Π°Π·ΠΎΠ²Ρ‹Ρ… языков C ΠΈ C++ различия ΠΌΠ΅ΠΆΠ΄Ρƒ этими катСгориями символов Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ сущСствСнны ΠΈ ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ лишь Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… функциях: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, функция isalpha провСряСт, являСтся Π»ΠΈ символ Π±ΡƒΠΊΠ²ΠΎΠΉ, Π° функция toupper ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ символы Π½ΠΈΠΆΠ½Π΅Π³ΠΎ рСгистра Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр ΠΈ оставляСт Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π±ΡƒΠΊΠ²Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра ΠΈ символы, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ. Подобная классификация символов опрСдСляСтся особСнностями ΠΊΡƒΠ»ΡŒΡ‚ΡƒΡ€Π½ΠΎΠΉ ΠΈ лингвистичСской срСды. Π’ английском языкС Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ символы ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Β«Π½Π΅ Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Ρ…Β», Π² швСдском β€” Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈ Ρ‚. Π΄. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΈΠΆΠ½Π΅Π³ΠΎ рСгистра Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ смысл Π² латинском Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅, Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π² ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π΅, ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π² ΠΈΠ²Ρ€ΠΈΡ‚Π΅.