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

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

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

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа с ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ нСдостаточно ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎ β€” Π² частности, ΠΏΡ€ΠΈ использовании 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+1];

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_1 сортировка списка ΠΈΠ· 23 791 слова заняла 0,86 сСкунды, Π° ΠΏΡ€ΠΈ использовании lt_str_2 понадобилось Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 0,4 сСкунды.

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

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

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

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

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

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

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

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

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

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

vector<Widget> vw1, vw2;

…

vw1.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(), lw.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> scw;

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

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

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

template <class T, 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, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡΡ‚Π°Π²Π°Π»Π°ΡΡŒ практичСски Π² Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΌ состоянии.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСализация STL, поставляСмая с MSVC4-6, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π»Π°ΡΡŒ для компилятора Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ шаблонов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ классов, Π°Π²Ρ‚ΠΎΡ€Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ эти ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ функциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈΡΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр, шаблон insert Π±Ρ‹Π» Π·Π°ΠΌΠ΅Π½Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ:

void insert(iterator position,   // "iterator" - Ρ‚ΠΈΠΏ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°

 iterator first, iterator last); // для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Π­Ρ‚Π° ограничСнная Ρ„ΠΎΡ€ΠΌΠ° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ позволяла Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΡƒΡŽ вставку ΠΈΠ· vector<Widget> Π² vector<Widget> ΠΈΠ»ΠΈ ΠΈΠ· list<int> Π² list<int>, Π½ΠΎ ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вставка ΠΈΠ· vector<Widget> Π² list<Widget> ΠΈΠ»ΠΈ ΠΈΠ· set<int> Π² deque<int>) Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΈΡΡŒ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π°ΡΡŒ Π΄Π°ΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Π°Ρ вставка (Π° Ρ‚Π°ΠΊΠΆΠ΅ конструированиС ΠΈΠ»ΠΈ assign) ΠΈΠ· vector<long> Π² vector<int>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ vector<long>::iterator ΠΈ vector<int>::iterator относятся ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ компиляторами, Π½Π΅ компилируСтся Π² MSVC4-6:

istream_iterator<Widget> begin(cin), end; // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ begin ΠΈ end

                                          // для чтСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget

                                          // ΠΈΠ· cin (см. совСт 6).

vector<Widget> vw(begin, end); // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Widget

                               // ΠΈΠ· cin Π² vw (см. совСт 6)

                               // Π½Π΅ компилируСтся Π² MSVC4-6!

list<Widget> lw;

lw.assign(vw.rbegin(), vw.rend()); // ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ lw содСрТимоС vw