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

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

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

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символов Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, подходящСй для простого английского тСкста. Π‘ΠΈΠΌΠ²ΠΎΠ» '\374' Π½Π΅ измСняСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ toupper, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ считаСтся Π±ΡƒΠΊΠ²ΠΎΠΉ; Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ ΓΌ, Π½ΠΎ для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ с английским тСкстом, это нСсущСствСнно. Π’ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ ASCII Π½Π΅Ρ‚ символа ΓΌ. Команда

setlocale(LC_ALL, "de");

сообщаСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ C ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π² систСмС IRIX β€” ΠΈΠΌΠ΅Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстов Π½Π΅ стандартизованы). Π’ Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΎΠΌ языкС Π΅ΡΡ‚ΡŒ символ ΓΌ, поэтому функция toupper ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΓΌ Π² Ü.

Π£ любого Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ программиста этот Ρ„Π°ΠΊΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ обоснованноС бСспокойство. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, простая функция toupper, вызываСмая с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, зависит Π΅Ρ‰Π΅ ΠΈ ΠΎΡ‚ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ β€” Ρ…ΡƒΠΆΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΡ‚ скрытой глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ стандартной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅: Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ toupper, тСорСтичСски ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ любая другая функция Π²ΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

ΠŸΡ€ΠΈ использовании toupper для сравнСния строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ катастрофичСским. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ вас имССтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ отсортированный, список (скаТСм, binary_search); всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ Π²Π΄Ρ€ΡƒΠ³ Π½ΠΎΠ²Ρ‹ΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст Π½Π° Ρ…ΠΎΠ΄Ρƒ измСняСт порядок сортировки. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ использования. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΅Π΄Π²Π° Π»ΠΈ способСн принСсти ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·Ρƒ. Π•Π³ΠΎ нСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ мноТСством Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setlocalΠ΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ удастся ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ большой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½ΠΎ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ сопровоТдСния. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ удастся ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ setlocalΠ΅, Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² setlocalΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹?

Π’ языкС C ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ сущСствуСт. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° C ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ СдинствСнный Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст, ΠΈ с этим Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ подСлаСшь. РСшСниС сущСствуСт Π² языкС C++.

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

Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ C++ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст Π½Π΅ являСтся глобальной структурой Π΄Π°Π½Π½Ρ‹Ρ…, запрятанной Π³Π΄Π΅-Ρ‚ΠΎ Π² Π½Π΅Π΄Ρ€Π°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° std::locale, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для стандартного локального контСкста:

std::locale L = std::locale::classic();

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΎΠ³ΠΎ языка создаСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ

std::locale L("de");

ИмСна Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстов, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ C, Π½Π΅ стандартизованы. Бписок ΠΈΠΌΠ΅Π½ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстов, доступных Π² вашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, слСдуСт ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ контСксты C++ дСлятся Π½Π° фасСты (facets), связанныС с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ аспСктами ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Для извлСчСния Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ фасСта ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° локального контСкста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция std::use_facet[6]. ЀасСт ctype ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ символов, Π² Ρ‚ΠΎΠΌ числС ΠΈ прСобразования Ρ‚ΠΈΠΏΠ°. Если c1 ΠΈ c2 относятся ΠΊ Ρ‚ΠΈΠΏΡƒ char, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ сравниваСт ΠΈΡ… Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ локального контСкста L.

const std::ctype<char>& ct = std::use_facet<std::ctype<char> >(L);

bool result = ct.toupper(c1) < ct.toupper(c2);

ΠŸΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½Π° особая сокращСнная запись: std::toupper(c, L), эквивалСнтная

std::use_facet<std::ctype<char> >(L).toupper(c)

ИспользованиС use_facet стоит свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ связано с Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ.

По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ лСксикографичСскоС сравнСниС оказываСтся нСподходящим Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях, прСобразования символов Β«ΠΎΠ΄ΠΈΠ½-Π²-ΠΎΠ΄ΠΈΠ½Β» Ρ‚ΠΎΠΆΠ΅ годятся Π½Π΅ всСгда (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΎΠΌ языкС символ (ß Π½ΠΈΠΆΠ½Π΅Π³ΠΎ рСгистра соотвСтствуСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Β«SSΒ» Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС). К соТалСнию, срСдства прСобразования рСгистра Π² стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π‘ ΠΈ C++ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами. Если это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ вас Π½Π΅ устраиваСт, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ со стандартными Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚.

ЀасСт collate

Если Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ контСкстами C++, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡˆΠ΅Π» Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ сравнСния строк. Π£ фасСта collate, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для инкапсуляции тСхничСских аспСктов сортировки, имССтся функция, ΠΏΠΎ интСрфСйсу вСсьма близкая ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C strcmp. БущСствуСт Π΄Π°ΠΆΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π΅Π΅ сравнСниС Π΄Π²ΡƒΡ… строк: для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° локального контСкста L строки x ΠΈ y ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ простой записью L(x, y), Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· Ρ…Π»ΠΎΠΏΠΎΡ‚, связанных с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ use_facet ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ collate.

Β«ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉΒ» Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст содСрТит фасСт collate, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт лСксикографичСскоС сравнСниС ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ operator< ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° string, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ контСксты Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ сравнСниС, Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΡƒΡΡΡŒ своими критСриями. Если Π² систСмС сущСствуСт Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ сравнСниС строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра для ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… вас языков, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΈΠΌ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, этот Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ простым сравнСниСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… символов!

К соТалСнию, ΠΊΠ°ΠΊΠΎΠΉ Π±Ρ‹ справСдливой Π½ΠΈ Π±Ρ‹Π»Π° эта рСкомСндация, ΠΎΠ½Π° Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π΅ΠΌ, Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстов. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ стандартноС мноТСство Ρ‚Π°ΠΊΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстов Π±ΡƒΠ΄Π΅Ρ‚ стандартизировано, Π½ΠΎ сСйчас Π½ΠΈΠΊΠ°ΠΊΠΈΡ… стандартов Π½Π΅ сущСствуСт. Если функция сравнСния Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра для вашСй систСмы Π΅Ρ‰Π΅ Π½Π΅ написана, Π²Π°ΠΌ придСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

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

ЀасСт ctype позволяСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сравнСниС строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра Π½Π° основС сравнСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… символов. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ вСрсия Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°, Π½ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ½Π° Π²Π΅Ρ€Π½Π°. Π’ Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ практичСски Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅: строки ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ lexicographical_compare, Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ символы ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ послС привСдСния ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π½Π° этот Ρ€Π°Π· вмСсто глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ локального контСкста. ΠšΡΡ‚Π°Ρ‚ΠΈ говоря, сравнСниС послС привСдСния ΠΎΠ±ΠΎΠΈΡ… символов ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру Π½Π΅ всСгда Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ послС привСдСния ΠΊ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ рСгистру. НапримСр, Π²ΠΎ французском языкС Π² символах Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра принято ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ диакритичСскиС Π·Π½Π°ΠΊΠΈ, вслСдствиС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ² toupper Π²ΠΎ французском локальном контСкстС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ: символы 'Ρ‘' ΠΈ 'Π΅' ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ символ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра 'Π•'. Π’ этом случаС ΠΏΡ€ΠΈ сравнСнии Π½Π° Π±Π°Π·Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ toupper символы 'Γ©' ΠΈ 'Π΅' Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ, Π° ΠΏΡ€ΠΈ сравнСнии Π½Π° Π±Π°Π·Π΅ tolower ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ. Какой ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½? ВСроятно, Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ всС зависит ΠΎΡ‚ языка, Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π°Π΅Π² ΠΈ спСцифики прилоТСния.

struct lt_str_1:

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

 struct lt_char {

  const std::ctype<char>& ct;

 lt_char(const std::ctype<char>& c):ct(c) {}

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

  return ct.toupper(x) < ct.toupper(y);

 }

};


std::locale loc;

const std::ctype<char>& ct;


lt_str_l(const std::locale& L = std::locale::classic()):

 loc(L), ct(std::use_facet<std::ctype<char> >(loc)) {}


bool operator()(const std::string& x, const std::string& y) const {

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

  y.begin(), y.end(), lt_char(ct));

 }

};

Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ; ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° чисто тСхничСская: функция toupper вызываСтся Π² Ρ†ΠΈΠΊΠ»Π΅, Π° Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ C++ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта функция Π±Ρ‹Π»Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ. НСкоторыС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ выводят Π²Ρ‹Π·ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ этого Π½Π΅ происходит. ЦикличСскиС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ сущСствуСт. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡΠΎΠ±Π»Π°Π·Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΌΡ‹ΡΠ»ΡŒ β€” Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ctype:

const char* ctype<char>::toupper(char* f, char* i) const

Π­Ρ‚Π° функция измСняСт рСгистр символов Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ [f, i]. К соТалСнию, для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ этот интСрфСйс Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для сравнСния Π΄Π²ΡƒΡ… строк, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π΅ строки Π² Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… содСрТимоС ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру. Но ΠΎΡ‚ΠΊΡƒΠ΄Π° Π²ΠΎΠ·ΡŒΠΌΡƒΡ‚ΡΡ эти Π±ΡƒΡ„Π΅Ρ€Ρ‹? Они Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ массивами фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (нСизвСстно, ΠΊΠ°ΠΊΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€), Π° динамичСскиС массивы ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ дорогостоящСго выдСлСния памяти.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа с ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ нСдостаточно ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎ β€” Π² частности, ΠΏΡ€ΠΈ использовании 32-разрядных символов UCS-4 ΠΎΠ½ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ нСработоспособно. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‚ΠΈΠΏΠΎΠΌ char (8-разрядным Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм) идСя хранСния 256 Π±Π°ΠΉΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния выглядит Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ.