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

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

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

class Widget {

public:

 β€¦

 void test(); // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ самопровСрку. Если ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

 β€¦            // Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ помСчаСтся

};            // ΠΊΠ°ΠΊ "ΠΏΠ»ΠΎΡ…ΠΎΠΉ"

Π’ идСальном ΠΌΠΈΡ€Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ for_each для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Widget::test всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vw:

for_each(vw.begin(), vw.end(),

 &Widget::test); // Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2 (Π½Π΅ компилируСтся!)

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π±Ρ‹ наш ΠΌΠΈΡ€ Π±Ρ‹Π» Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ for_each ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ для Π²Ρ‹Π·ΠΎΠ²Π° Widget::test Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Widget*:

list<Widget*> lpw; // Бписок lpw содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

                   // Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Widget

for_each(lpw.begin(), lpw.end(), // Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3 (Π½Π΅ компилируСтся!)

 &widget::test);

Но ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² этом идСальном ΠΌΠΈΡ€Π΅. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ for_each Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ 1 вызываСтся внСшняя функция, поэтому Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ синтаксис 1. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° for_each Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ 2 слСдовало Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис 2, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вызываСтся функция класса. А Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ for_each Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ 3 ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис 3, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΌ понадобились Π±Ρ‹ Ρ‚Ρ€ΠΈΡ€Π°Π·Π½Ρ‹Ρ… вСрсии for_each β€” Ρ€Π°Π·Π²Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΈΡ€ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ?

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° вСрсия for_each. НСтрудно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ:

template<typename InputIterator, typename Function>

Function for_each(InputIterator begin, InputIterator end, Function f) {

 while (begin != end) f(*begin++);

}

Π–ΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выдСлСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ for_each ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ синтаксис 1. Π’ STL сущСствуСт всСобщСС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ всСгда Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ синтаксичСской Ρ„ΠΎΡ€ΠΌΠ΅ (ΠΊΠ°ΠΊ внСшниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Бтановится понятно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1 компилируСтся, Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 2 ΠΈ 3 Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ β€” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ STL (Π² Ρ‚ΠΎΠΌ числС ΠΈ for_each) ТСстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° использованиС синтаксиса Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ совмСстим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ понятно, для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mem_fun ΠΈ mem_fun_ref. Они ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ классов (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² синтаксисС 2 ΠΈ 3) ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ синтаксиса 1.

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

template<typename R, typename C> // ОбъявлСниС mem_fun для нСконстантных

 mem_fun_t<R, C>                 // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π‘ - класс.

mem_fun(R(C::*pmf)()); // R - Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

                       // Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

Ѐункция mem_fun создаСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ pmf Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ класса ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° mem_fun_t. Π’ΠΈΠΏ прСдставляСт собой класс Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°, содСрТащий ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ operator(), которая ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ operator(). НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅:

list<Widget*> lpw; // Π‘ΠΌ. Ρ€Π°Π½Π΅Π΅

…

for_each(lpw.begin(), lpw.end(),

 mem_fun(&Widget::test)); // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ компилируСтся

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ for_each пСрСдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° mem_fun_t, содСрТащий ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Widget::test. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ указатСля Widget* Π² lpw Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ for_each Β«Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ mem_fun_t с использованиСм синтаксиса 1, Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ нСпосрСдствСнно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Widget::test для указатСля Widget* с использованиСм синтаксиса 3.

Π’ Ρ†Π΅Π»ΠΎΠΌ mem_fun ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ синтаксис 3, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для Widget::test ΠΏΡ€ΠΈ использовании с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Widget*, ΠΊ синтаксису 1, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ for_each. По Π²ΠΏΠΎΠ»Π½Π΅ понятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Ρ‚Π°ΠΊΠΈΠ΅ классы, ΠΊΠ°ΠΊ mem_fun_t, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НавСрноС, Π²Ρ‹ ΡƒΠΆΠ΅ догадались, Ρ‡Ρ‚ΠΎ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ со всСм, ΠΎ Ρ‡Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mem_fun_ref Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΡŽΡ‚ синтаксис 2 ΠΊ синтаксису 1 ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° mem_fun_ref_t.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, создаваСмыС функциями mem_fun ΠΈ mem_fun_ref, Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ простой ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ синтаксиса для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² STL. Они (Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, создаваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ptr_fun) Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²Π°ΠΆΠ½Ρ‹Π΅ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ². Об этих опрСдСлСниях ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ рассказано Π² совСтС 40, поэтому я Π½Π΅ стану ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, стоит Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ конструкция

for_each(vw.begin(), vw.end(), test); // Π‘ΠΌ. Ρ€Π°Π½Π΅Π΅, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1.

                                      // ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ компилируСтся

компилируСтся, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ конструкции Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ:

for_each(vw.begin(), vw.end(), &Widget::test); // Π‘ΠΌ. Ρ€Π°Π½Π΅Π΅, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 2.

                                               // НС компилируСтся.

for_each(lpw.begin(), lpw.end(), &Widget::test); // Π‘ΠΌ. Ρ€Π°Π½Π΅Π΅, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 3.

                                                 // НС компилируСтся

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1) пСрСдаСтся настоящая функция, поэтому адаптация синтаксиса Π²Ρ‹Π·ΠΎΠ²Π° для for_each Π½Π΅ Π½ΡƒΠΆΠ½Π°; Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сам Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π΅Π΅ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ синтаксисом. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, for_each Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ², добавляСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ptr_fun, поэтому ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ test функция ptr_fun Π½Π΅ Π½ΡƒΠΆΠ½Π°. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ опрСдСлСния Π½Π΅ поврСдят, поэтому ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ эквивалСнтСн ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅:

for_each(vw.begin(), vw.end(), ptr_fun(test)); // ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚,

                                               // ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1.

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

БущСствуСт ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ptr_fun Π² случаС ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ нСобходимости. Если функция отсутствуСт Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ², компилятор Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС. Π’ΠΎΠ³Π΄Π° Π²Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Π² Π½Π΅Π΅ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ².

Π‘ mem_fun ΠΈ mem_fun_ref ситуация ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ иная. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ STL, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠΌΠΈΠΌΠΎ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ»ΠΈ Π½Π΅Ρ‚) ΠΎΠ½ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΡŽΡ‚ синтаксис Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса, ΠΊ синтаксису, принятому Π² STL. Если Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ лишь Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ со странными ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ². ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ самый настоящий ΠΏΠ΅Ρ€Π΅ΠΆΠΈΡ‚ΠΎΠΊ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ STL. Когда Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π°Ρ…, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ STL ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ нСдостатков Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², описанных Π² совСтах 7, 20 ΠΈ 33, это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Π½ΠΎ Π½Π΅ стоит Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² β€” Π½Π΅Ρ‚). Когда понадобился Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ классов (MEMber FUNctions), Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π»ΠΈ mem_fun. Волько ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ поняли, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² понадобится Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€, ΠΈ для этой Ρ†Π΅Π»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π΅Π»ΠΈ имя mem_fun_ref. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, выглядит Π½Π΅ слишком элСгантно, но… Π±Ρ‹Π²Π°Π΅Ρ‚, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ подСлаСшь. ΠŸΡƒΡΡ‚ΡŒ Ρ‚ΠΎΡ‚, ΠΊΠΎΠΌΡƒ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΆΠ°Π»Π΅Ρ‚ΡŒ ΠΎ поспСшном Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΈΠΌΠ΅Π½ своих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ бросит камСнь.

Π‘ΠΎΠ²Π΅Ρ‚ 42. Π‘Π»Π΅Π΄ΠΈΡ‚Π΅ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ конструкция less<T> ΠΎΠ·Π½Π°Ρ‡Π°Π»Π° operator<

Допустим, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Widget ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ weight ΠΈ maxSpeed:

class Widget {

public:

 β€¦

 size_t weight() const;

 size_t maxSpeed() const;

 β€¦

}

Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ СстСствСнная сортировка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Widget осущСствляСтся ΠΏΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ weight, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ < класса Widget:

bool operator<(const Widget& lhs, const Widget& rhs) {

 return lhs.weight()<rhs.weight();

}

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ multiset<Widget>, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Widget отсортированы ΠΏΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ maxSpeed. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° multiset<Widget> ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция сравнСния less<Widget>, которая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ operator< класса Widget. ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ СдинствСнный способ сортировки multiset<Widget> ΠΏΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ maxSpeed основан Π½Π° Ρ€Π°Π·Ρ€Ρ‹Π²Π΅ связи ΠΌΠ΅ΠΆΠ΄Ρƒ less<Widget> ΠΈ operator< ΠΈ спСциализации less<Widget> Π½Π° сравнСнии Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° maxSpeed: