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

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

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

ВзглянитС Π΅Ρ‰Π΅ Ρ€Π°Π·. Π”Π°, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ nicknames объявлСн ΠΊΠ°ΠΊ нСконстантный Ρ‚ΠΈΠΏ map, Π½ΠΎ функция showEmalAddress являСтся константной, Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ константной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всС нСстатичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ класса становятся константными! Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π½ΡƒΡ‚Ρ€ΠΈ showEmalAddress ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ nicknames являСтся константным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ map. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ смысл. ΠœΡ‹ пытаСмся ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ iterator для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° map, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π΅Ρ‰Π°Π»ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈΠ±ΠΎ привСсти i ΠΊ Ρ‚ΠΈΠΏΡƒ const_iterator, Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ showEmalAddress нСконстантной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. ВСроятно, ΠΎΠ±Π° способа ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… усилий, Ρ‡Π΅ΠΌ выяснСниС смысла сообщСния ΠΎΠ± ошибкС.

Π’ этом совСтС Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тСкстовыС подстановки, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‰ΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π½ΠΎ послС Π½Π΅ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π²Ρ‹ смоТСтС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ подстановки Π² Π³ΠΎΠ»ΠΎΠ²Π΅. Π― Π½Π΅ ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π½Ρ‚, Π½ΠΎ ΠΌΠ½Π΅ рассказывали, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π½Ρ‚Ρ‹ способны Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρ‚ΠΈΡ‚ΡƒΡ€Ρƒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π½Π΅ ΠΏΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡΡΡŒ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π½ΠΎΡ‚Π°ΠΌ. ΠžΠΏΡ‹Ρ‚Π½Ρ‹Π΅ программисты STL ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ. Они ΠΌΠΎΠ³ΡƒΡ‚ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²ΠΈΠ΄Π° std::basic_string<char, std::char_traits<char>, std::allocator<char> > Π² string, нисколько Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ Π½Π°Π΄ происходящим. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π½Π°Π²Ρ‹ΠΊ Ρ€Π°Π·ΠΎΠ²ΡŒΠ΅Ρ‚ΡΡ ΠΈ Ρƒ вас, Π½ΠΎ Π΄ΠΎ этих ΠΏΠΎΡ€ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ диагностику компилятора ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠΎΠΆΠ½ΠΎ привСсти ΠΊ Π²Ρ€Π°Π·ΡƒΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Π±Π°Π·Π΅ шаблонов Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ мнСмоничСскими обозначСниями. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях для этого достаточно Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ИмСнно это Π±Ρ‹Π»ΠΎ сдСлано Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ std::map<class string, class string, struct std::less<class string>, class std::allocator<class string> >  Π½Π° NicknameMap.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² сообщСниях компилятора, относящихся ΠΊ STL.

β€’ Для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² vector ΠΈ string ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, поэтому Π² случаС ошибки с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π² диагностикС компилятора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. НапримСр, Ссли Π² исходном ΠΊΠΎΠ΄Π΅ имССтся ссылка Π½Π° vector<double>::iterator, Π² сообщСнии ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ double*. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ составляСт рСализация STLport Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅; Π² этом случаС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ vector ΠΈ string Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ указатСлями. Π—Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ STLport ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ совСту 50.

β€’ Π‘ообщСния, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ back_insert_iterator, front_insert_iterator ΠΈ insert_iterator, ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ошибка Π±Ρ‹Π»Π° Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ back_inserter, front_inserter ΠΈΠ»ΠΈ inserter соотвСтствСнно (back_inserter Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° back_insert_iterator, front_inserter Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° front_insert_iterator, a inserter Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° insert_iterator; Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± этих Ρ‚ΠΈΠΏΠ°Ρ… ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ совСту 30). Если эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (косвСнно ΠΈΠ»ΠΈ явно).

β€’ Π‘ообщСния с упоминаниями binder1st ΠΈ binder2nd ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ± ошибкС ΠΏΡ€ΠΈ использовании bind1st ΠΈ bind2nd (bind1st Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° binder1st, a bind2nd Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° binder2nd).

β€’ Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ostream_iterator ΠΈ ostream_buf_iterator β€” см. совСт 29, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ back_inserter, front_inserter ΠΈ inserter) Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ свои ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ вставки Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присваивания, поэтому ошибки, относящиСся ΠΊ этим Ρ‚ΠΈΠΏΠ°ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ приводят ΠΊ появлСнию сообщСний ΠΎΠ± ошибкС Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присваивания, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ ΠΈ понятия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΎ Ρ‡Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

vector<string*> v;                     // ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π° содСрТимого

copy(v.begin(), v.end(),             // ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ string*

ostream_iterator<string>(cout, "\n")); // ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² string

β€’ Π•сли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС исходит ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° STL (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ссли ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка, находится Π² <algoritm>), вСроятно, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ этому Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

list<int>::iterator i1, i2; // ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° двусторонних ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

sort(i1, i2);               // Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

                            // ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа

β€’ Π•сли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ стандартный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ STL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ vector ΠΈΠ»ΠΈ string, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ for_each), Π° компилятор ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ понятия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚, Ρ‡Ρ‚ΠΎ имССтся Π² Π²ΠΈΠ΄Ρƒ, скорСС всСго, Π²Ρ‹ Π·Π°Π±Ρ‹Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #include. Как ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² совСтС 48, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΈ пСрСносС Π΅Π³ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ.

Π‘ΠΎΠ²Π΅Ρ‚ 50. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ web-сайтах, посвящСнных STL

Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π±ΠΎΠ³Π°Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± STL. Если ввСсти Π² любой поисковой систСмС запрос Β«STLΒ», Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сотни ссылок, Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов STL Π² поисках Π½Π΅ нуТдаСтся ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сайты:

β€’ ΡΠ°ΠΉΡ‚ SGI STL, http://www.sgi.com/tech/stl;

β€’ ΡΠ°ΠΉΡ‚ STLport, http://stlport.org;

β€’ ΡΠ°ΠΉΡ‚ Boost, http://www.boost.org.

НиТС я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ эти сайты Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ вашСго внимания.

Π‘Π°ΠΉΡ‚ SGI STL

Web-сайт SGI STL Π½Π΅ случайно находится Π² Π½Π°Ρ‡Π°Π»Π΅ списка. На Π½Π΅ΠΌ имССтся подробная докумСнтация ΠΏΠΎ всСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ STL. МногиС программисты Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ основной источник элСктронной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π΅Π·Π°Π²4исимо ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ STL. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ собрал ΠœΡΡ‚Ρ‚ ΠžΡΡ‚Π΅Ρ€Π½ (Matt Austern), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ» Π΅Π΅ ΠΈ прСдставил Π² ΠΊΠ½ΠΈΠ³Π΅ Β«Generic Programming and the STLΒ» [4]. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π΅ сводится ΠΊ простому описанию ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² STL. НапримСр, описаниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ бСзопасности ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² STL (см. совСт 12) основано Π½Π° ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°Ρ… сайта SGI STL.

На сайтС SGI программисту прСдлагаСтся свободно распространяСмая рСализация STL. Она Π±Ρ‹Π»Π° Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° лишь для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° компиляторов, Π½ΠΎ поставка STL Π»Π΅Π³Π»Π° Π² основу распространСнной поставки STLport, описанной Π½ΠΈΠΆΠ΅. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ STL ΠΎΡ‚ SGI входят Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСстандартныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² STL Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ, Π½ΠΎ ΠΈ Π±ΠΎΠ»Π΅Π΅ интСрСсным. НСкоторыС ΠΈΠ· Π½ΠΈΡ… стоит Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ.

β€’ Π₯ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ассоциативныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ hash_set, hash_multiset, hash_map ΠΈ hash_multimap. Π—Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± этих ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ совСту 25.

β€’ ΠžΠ΄Π½ΠΎΡΠ²ΡΠ·Π½Ρ‹ΠΉ список slist. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ slist Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ стандартным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚Π΅ ΡƒΠ·Π»Ρ‹ списка, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ. К соТалСнию, этот Ρ„Π°ΠΊΡ‚ оборачиваСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ insert ΠΈ erase, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» списка Π² ΡƒΠ·Π»Π΅, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ‚ΠΎΠΌΡƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€. Π’ двусвязном спискС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² стандартном ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ list) это Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½ΠΎ Π² односвязном спискС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΡƒΠ·Π»Ρƒ являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ с Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. Π’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ slist ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ SGI Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert ΠΈ erase Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ вмСсто постоянной, Ρ‡Ρ‚ΠΎ являСтся сущСствСнным нСдостатком. Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ SGI эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ нСстандартных (Π½ΠΎ Π·Π°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с постоянной ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ insert_after ΠΈ erase_after. Π’ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ говорится:

…Если окаТСтся, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert_after ΠΈ erase_after ΠΏΠ»ΠΎΡ…ΠΎ подходят для Π²Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ, ΠΈ Π²Π°ΠΌ часто приходится Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert ΠΈ erase Π² сСрСдинС списка, вСроятно, вмСсто slist Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ list.

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Dinkumware Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ односвязный список slist, Π½ΠΎ Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰Π°Ρ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… insert ΠΈ erase. Π—Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Dimkumware ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π‘.

β€’ ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ rope, Π°Π½Π°Π»ΠΎΠ³ string для ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… строк. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ SGI ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ rope описываСтся Ρ‚Π°ΠΊ:

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ rope прСдставляСт собой ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ string: ΠΎΠ½ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для эффСктивного выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со строками Π² Ρ†Π΅Π»ΠΎΠΌ. Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ присваиваниС, конкатСнация ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ подстроки, практичСски Π½Π΅ зависят ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ строки. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ строк C, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ rope обСспСчиваСт Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠ΅ прСдставлСниС для ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… строк (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, содСрТимого Π±ΡƒΡ„Π΅Ρ€Π° тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ сообщСний элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹).

Π’ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ прСдставлСнии ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ rope рСализуСтся Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° подстрок с подсчСтом ссылок, ΠΏΡ€ΠΈ этом каТдая строка хранится Π² Π²ΠΈΠ΄Π΅ массива char. Одна ΠΈΠ· интСрСсных особСнностСй интСрфСйса rope Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ begin ΠΈ end всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚ΠΈΠΏ const_iterator. Π­Ρ‚ΠΎ сдСлано для прСдотвращСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ символы. Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ обходятся слишком Π΄ΠΎΡ€ΠΎΠ³ΠΎ. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ rope ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с тСкстом Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈΠ»ΠΈ большими Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (присваиваниС, конкатСнация ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ подстроки); ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нСэффСктивно.