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

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

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

Другая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Ρ…ΠΈΡ‚Ρ€Ρ‹Π΅ синтаксичСскиС Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ. Иногда исходный тСкст, выглядящий Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, отвСргаСтся компилятором ΠΏΠΎ Π·Π°ΠΊΠΎΠ½Π½Ρ‹ΠΌ, хотя ΠΈ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. НапримСр, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях имя экзСмпляра, созданного Π½Π° Π±Π°Π·Π΅ шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ эквивалСнтно ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

template<typename FPType>                // ВычислСниС срСднСго

FPType average(FPType val1, FPType val2) // арифмСтичСского Π΄Π²ΡƒΡ…

{                                        //вСщСствСнных чисСл

 return (val1 + val2)/2;

};


template<typename InputIter1, typename InputIter2>

void writeAverages(InputIter begin1, // Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΠ°Ρ€Π½Ρ‹Π΅

 InputIter end1,                     // срСдниС значСния

 InputIter begin2,                   // Π΄Π²ΡƒΡ… сСрий элСмСнтов

 ostream& s) {                       // Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅

 transform(begin1, end1, begin2,

  ostream_iterator<typename iterator_traits<InputIter1>::value_type>(s, "\n"),

  average<typename iterator traits<InputIter1>::value_type>()); // Ошибка?

}

МногиС компиляторы ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ этот ΠΊΠΎΠ΄, Π½ΠΎ ΠΏΠΎ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρƒ C++ ΠΎΠ½ считаСтся нСдопустимым. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ тСорСтичСски ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π΅ΠΌ average, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ-Ρ‚ΠΈΠΏΠΎΠΌ. Π’ этом случаС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ average<typename iterator_traits<InputIter1>::value_type> становится Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСпонятно, ΠΊΠ°ΠΊΠΎΠΉ шаблон Π² Π½Π΅ΠΌ упоминаСтся. Π’ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ отсутствуСт, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компиляторы Π½Π° Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½ΠΎΠΌ основании всС Ρ€Π°Π²Π½ΠΎ ΠΎΡ‚Π²Π΅Ρ€Π³Π°ΡŽΡ‚ этот ΠΊΠΎΠ΄. РСшСниС основано Π½Π° использовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

template<typename FPType>

struct Average:

 public binary_function<FPType, FPType, FPType> { // Π‘ΠΌ. совСт 40

 FPType operator()(FPType val1, FPType val2) const {

  return average(val1, val2);

 }

};


template<typename InputIter1, typename InputIter2>

void writeAverages(InputIter1 begin1, InputIter1 end1,

 InputIter2 begin2, ostream& s) {

 transform(begin1, end1, begin2,

 ostream_iterator<typename iterator_traits<InputIter1>::value_type>(s, "\n"),

  Average<typename iterator_traits<InputIter1>::value_type());

}

Новая вСрсия Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌ компилятором. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹Π·ΠΎΠ²Ρ‹ Average::operator() Π²Π½ΡƒΡ‚Ρ€ΠΈ transform Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ подстановку ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ Π½Π΅ относится ΠΊ экзСмплярам ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ шаблона average, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ average являСтся шаблоном Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, прСимущСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Ρ€ΠΎΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π½Π΅ сводится ΠΊ простому ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ эффСктивности. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ большСй Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π°. БСсспорно, «настоящиС» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹, Π½ΠΎ Π² области эффСктивного программирования Π² STL ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ часто ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π΅Π·Π½Π΅Π΅.

Π‘ΠΎΠ²Π΅Ρ‚ 47. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Β«Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ³ΠΎΒ» ΠΊΠΎΠ΄Π°

Допустим, имССтся Π²Π΅ΠΊΡ‚ΠΎΡ€ vector<int>. Из этого Π²Π΅ΠΊΡ‚ΠΎΡ€Π° трСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС элСмСнты, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСньшС Ρ…, Π½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнты, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ послСднСму Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ значСния, Π½Π΅ мСньшСго Ρƒ. Π’ Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:

vector<int> v;

int Ρ…, Ρƒ;

…

v.erase(

 remove_if(find_if(v.rbegin(), v.rend(),

 bind2nd(greater_equal<int>(), y)).base(),

 v.end(),

bind2nd(less<int>(),x)),

 v.end());

ВсСго ΠΎΠ΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΈ Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ΅Π½Π°. ВсС просто ΠΈ прямолинСйно. Никаких ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. ΠŸΡ€Π°Π²Π΄Π°?

НС Π±ΡƒΠ΄Π΅ΠΌ Ρ‚ΠΎΡ€ΠΎΠΏΠΈΡ‚ΡŒΡΡ с Π²Ρ‹Π²ΠΎΠ΄Π°ΠΌΠΈ. Π‘Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π² сопровоТдСнии? «НСт!Β» β€” воскликнСт Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов C++ с уТасом ΠΈ ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ. Β«Π”Π°!Β» β€” скаТут считанныС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ с явным ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ. Π’ этом ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π’ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ программист считаСт Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ простотой, Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ прСдставляСтся адским Π½Π°Π²Π°ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ.

Насколько я понимаю, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ бСспокойство ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ содСрТит слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΎ Ρ‡Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚Ρƒ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ обозначСниями fn:

v.f1(f2(f3(v.f4(), v.f5(),f6(f7(), y)).f8(), v.f9(), f6(f10(), x)), v.f9());

Вакая запись выглядит нССстСствСнно услоТнСнной, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ· Π½Π΅Π΅ ΡƒΠ±Ρ€Π°Π½Ρ‹ отступы, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² исходном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. МоТно ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов C++ сочтСт, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² дСсяти Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ β€” это ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€. Но программисты с ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языках Ρ‚ΠΈΠΏΠ° Scheme ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅. По своСму ΠΎΠΏΡ‹Ρ‚Ρƒ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всС программисты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просматривали этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π±Π΅Π· ΠΌΠ°Π»Π΅ΠΉΡˆΠΈΡ… ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² удивлСния, ΠΈΠΌΠ΅Π»ΠΈ ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ программирования Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языках. Π£ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° программистов C++ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠΏΡ‹Ρ‚ отсутствуСт, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли ваши ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ влоТСниям Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, конструкции Π²Ρ€ΠΎΠ΄Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° erase Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π·Π°ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ нСдостаток ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для Π΅Π³ΠΎ понимания Π½ΡƒΠΆΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°Ρ‚ΡŒ STL. Π’ Π½Π΅ΠΌ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Π½Π΅Π΅ распространСнныС _if-Ρ„ΠΎΡ€ΠΌΡ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² find ΠΈ remove, ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (см. совСт 26), прСобразования reverse_iterator Π² iterator (см. совСт 28), bind2nd ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ΄ΠΈΠΎΠΌΠ° erase-remove (см. совСт 32). ΠžΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ программист STL разбСрСтся Π² этой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π±Π΅Π· особого Ρ‚Ρ€ΡƒΠ΄Π°, Π½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ…, ΠΊΡ‚ΠΎ Π½Π°Π΄ΠΎΠ»Π³ΠΎ задумаСтся Π½Π°Π΄ Π½Π΅ΠΉ. Если ваши ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π΄Π°Π»Π΅ΠΊΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΠ»ΠΈΡΡŒ Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ STL, присутствиС erase, remove_if, find_if, base ΠΈ bind2nd Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π²ΠΏΠΎΠ»Π½Π΅ допустимо, Π½ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° понятна программисту C++ со срСдним ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° нСсколько Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² (ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ приводятся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ½ΠΈΠ³ΠΈ β€” я Π±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» ΠΈΡ… ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ).

typedef vector<int>::iterator VecIntIter;


// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ angeBegin ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом v, большим ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΌ

// послСднСму Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ Ρƒ. Если Ρ‚Π°ΠΊΠΎΠΉ элСмСнт Π½Π΅ сущСствуСт, rangeBegin

// инициируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ v.begin()

VecIntIter rangeBegin = find_if(v.rbegin(), v.rend(),

 bind2nd(greater_equal<int>(), y)).base();


// Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΡ‚ rangeBegin Π΄ΠΎ v.end всС элСмСнты со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, мСньшим Ρ…

v.erase(remove_if(rangeBegin, v.end(), bind2nd(less<int>(), x)), v.end());

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠ΅-ΠΊΠΎΠ³ΠΎ смутит, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ понимания ΠΈΠ΄ΠΈΠΎΠΌΡ‹ erase-remove, Π½ΠΎ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ справочника ΠΏΠΎ STL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«The C++ Standard LibraryΒ» [3] ΠΈΠ»ΠΈ web-сайта SGI [21]) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ программист C++ Π±Π΅Π· особых усилий разбСрСтся, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ происходит Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π² процСссС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ я Π½Π΅ отказался ΠΎΡ‚ использования Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ Π½Π΅ попытался Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ. Π’ совСтС 43 ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π² этом случаС. Основная Ρ†Π΅Π»ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании ΠΊΠΎΠ΄Π°, понятного ΠΊΠ°ΠΊ для компилятора, Ρ‚Π°ΠΊ ΠΈ для читатСля-Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ быстродСйствиСм. Алгоритмы ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π»ΡƒΡ‡ΡˆΠ΅ подходят для достиТСния этой Ρ†Π΅Π»ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, совСт 43 Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ интСнсивноС использованиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ частому влоТСнию Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ использованию Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ². ВСрнСмся ΠΊ постановкС Π·Π°Π΄Π°Ρ‡ΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ начинаСтся настоящий совСт.

Допустим, имССтся Π²Π΅ΠΊΡ‚ΠΎΡ€ vector<int>. Из этого Π²Π΅ΠΊΡ‚ΠΎΡ€Π° трСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС элСмСнты, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСньшС x, Π½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнты, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ послСднСму Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ значСния, Π½Π΅ мСньшСго y.

НСтрудно ΠΏΡ€ΠΈΠ΄Ρ‚ΠΈ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΉ схСмС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

β€’ ΠΏΠΎΠΈΡΠΊ послСднСго вхоТдСния значСния Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ примСнСния find ΠΈΠ»ΠΈ find_if с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ;

β€’ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ erase ΠΈΠ»ΠΈ ΠΈΠ΄ΠΈΠΎΠΌΡ‹ erase-remove.

ОбъСдиняя эти Π΄Π²Π΅ ΠΈΠ΄Π΅ΠΈ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ псСвдокод, Π³Π΄Π΅ Β«Π½Π΅Ρ‡Ρ‚ΠΎΒ» ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ смысловым содСрТаниСм:

v.erase(remove_if(find_if(v.rbegin(), v.rend(), Π½Π΅Ρ‡Ρ‚ΠΎ).base(),

 v.end(), Π½Π΅Ρ‡Ρ‚ΠΎ)), v.end());

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ схСмы Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ кроСтся Π·Π° Β«Π½Π΅Ρ‡Ρ‚ΠΎΒ», совсСм нСслоТно. Π’Ρ‹ Π½Π΅ успССтС ΠΎΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒΡΡ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚Π΅ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ ΠΈΠ· исходного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π’ΠΎ врСмя написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ выглядят Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½ΠΈΡ… отраТаСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ΄ΠΈΠΎΠΌΡ‹ erase-remove плюс использованиС find с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ). К соТалСнию, Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π½Π° Ρ‚Π΅ ΠΈΠ΄Π΅ΠΈ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ Π±Ρ‹Π» собран. «НСчитаСмый» ΠΊΠΎΠ΄ Π»Π΅Π³ΠΊΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ, Π½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ.