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

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

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

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

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

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

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));

}

};

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

int main() {

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

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

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

printf("sl<s2:2s\n",

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

?"true":"false"):

}

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

sl=GEWURZTRAMINER,s2=gewQrztraminer

sl<s2:true

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

setlocale(LC_ALL,"de");

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

sl=GEW0RZTRAMINER,s2=gewurztraminer

sl<s2:false

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

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

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

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

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

setlocale(LC_ALL,"de"):

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

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

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

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

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

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

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

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

std::locale L("de");

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

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

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

bool result = ct-toupper(cl)<ct.toupper(c2);

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

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

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

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

ЀасСт collate

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

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

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