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: