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

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

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

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

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

struct lt_str_l

: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 вызываСтся Π² Ρ†ΠΈΠΊΠ»Π΅, Π° Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Π‘++ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта функция Π±Ρ‹Π»Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ. НСкоторыС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ выводят Π²Ρ‹Π·ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ этого Π½Π΅ происходит. ЦикличСскиС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹.

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

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

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

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

struct lt_str_2:

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

struct lt_char{

const char* tab;

lt_char(const char* t):tab(t) {}

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

return tab[x-CHAR_MIN] < tab[y-CHAR-MIN];

}

};

char tab[CHAR_MAX-CHAR_MIN+l];

lt_str_2(const std::locale& L = std:.-locale::classic()){

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

for(int i = CHAR_MIN;i<=CHAR_MAX;++i) tab[i-CHAR_MIN]=(char)i;

ct.toupper(tab. tab+(CHAR_MAX-CHAR_MIN+1));

}

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

}

}

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, различия ΠΌΠ΅ΠΆΠ΄Ρƒ lt_str_1 ΠΈ lt_str_2 Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ Π²Π΅Π»ΠΈΠΊΠΈ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния символов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ фасСт ctype Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π·Π°Ρ€Π°Π½Π΅Π΅ вычислСнных ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ символов ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ уступаСт ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ, Ссли ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lt_str_2, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ для сравнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… строк ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ… lt_str_2 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС lt_str_1. Π’ ΠΌΠΎΠΈΡ… тСстах прСвосходство Π±Ρ‹Π»ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΌ: ΠΏΡ€ΠΈ использовании lt_str_l сортировка списка ΠΈΠ· 23 791 слова заняла 0,86 сСкунды, Π° ΠΏΡ€ΠΈ использовании lt_str_2 понадобилось Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 0,4 сСкунды.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ?

β€’ΠšΠ»Π°ΡΡ строки Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра символов рСализуСтся Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ абстракции. ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘++ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ, ΠΈ этот Ρ„Π°ΠΊΡ‚ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

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

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

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ сравнСниС строк Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° символов Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большого объСма Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½ΠΎ Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Или Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΊΠΎΠ»Π»Π΅Π³, Π½Π΅ хочСтся Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстах? Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π»Π΅Ρ‚ Π΄Π΅ΡΡΡ‚ΡŒ Π½Π°Π·Π°Π΄ Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΠ± «ошибкС 2000 Π³ΠΎΠ΄Π°Β». И всС ΠΆΠ΅ Ρƒ вас большС шансов ΠΎΠ±ΠΎΠΉΡ‚ΠΈ стороной эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Ссли ваш локально-зависимый ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ с самого Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ЗамСчания ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ STL ΠΎΡ‚ Microsoft

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ½ΠΈΠ³ΠΈ я Π²Π²Π΅Π» Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° STLΒ», ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ компилятора ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ STL. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ компилятором ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ особСнно Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ использовании компилятора Microsoft Visual Π‘++ вСрсий 6 ΠΈ Π½ΠΈΠΆΠ΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ компилятора, Π²Ρ…ΠΎΠ΄ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ поставки Microsoft Visual Studio вСрсий 6 ΠΈ Π½ΠΈΠΆΠ΅), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор ΠΈΠ½ΠΎΠ³Π΄Π° способСн Π½Π° большСС, Ρ‡Π΅ΠΌ прилагаСмая рСализация STL. Π’ настоящСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ описаны Π²Π°ΠΆΠ½Ρ‹Π΅ нСдостатки старых ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ STL ΠΎΡ‚ Microsoft ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° этих ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ.

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Microsoft Visual Π‘++ (MSVC) вСрсий 4-6. Π’ Visual Π‘++ .NET пСрСчислСнныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ классов Π² STL

Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget, трСбуСтся ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Widget ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π² ΠΊΠΎΠ½Π΅Ρ† Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π—Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π»Π΅Π³ΠΊΠΎ β€” достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ insert ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° vector:

vector<Widget> vw1,vw2;

vwl.insert(vw1.end(),vw2.begin().vw2.end()); // ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ vw1 копию

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget ΠΈΠ· vw2

ΠΠ½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ vector ΠΈ deque:

vector<Widget> vw;

deque<Widget> dw:

vw.insert(vw.end(),dw.begin(),dw.end()); // ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ vw копию

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget ΠΈΠ· dw

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… хранятся ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‚ Π΄Π°ΠΆΠ΅ нСстандартныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹:

vector<Widget> vw;

list<Widget> lw;

vw.insert(vw.begin().lw.begin().ww.end()); // ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ vw копию

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget ΠΈΠ· lw

set<Widget> sw;

vw.insert(vw.begin(),sw.begin(),sw.end()); // ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ vw копию

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget ΠΈΠ· sw

template<typename T,

typename Allocator - allocator<T> > // Π¨Π°Π±Π»ΠΎΠ½ нСстандартного

class SpecialContainer {...}:// STL-совмСстимого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

SpecialContainer<Widget> sew;

vw.insert(vw.begin().scw.begin().scw.end()); // ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ vw копию

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget ΠΈΠ· scw

Подобная ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Π°Ρ функция insert ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° range Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² общСпринятом смыслС. Π­Ρ‚ΠΎ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, спСциализация ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ insert. Для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° vector шаблон insert объявлСн Π² Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

template <class Π’, class Allocator = allocator<T> >

class vector {

public:

template<class InputIterator>

void insert(iterator position, InputIterator first. InputIterator last);

};

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ стандартный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert. АналогичныС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ для ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Ρ… конструкторов ΠΈ для ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ assign (см. совСт 5).

MSVC вСрсий 4-6

К соТалСнию, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ STL, входящСй Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ поставки вСрсий 4-6, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»Π°ΡΡŒ для MSVC вСрсии 4, Π° этот компилятор, ΠΊΠ°ΠΊ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ шаблонов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ классов. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ MSCV4 ΠΊ MSVC6 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° этих шаблонов Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² компилятор, Π½ΠΎ вслСдствиС судСбных Π΄Π΅Π», косвСнно Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π²ΡˆΠΈΡ… Ρ„ΠΈΡ€ΠΌΡƒ Microsoft, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡΡ‚Π°Π²Π°Π»Π°ΡΡŒ практичСски Π² Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΌ состоянии.