β’ ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ Π½Π΅ Π΄Π°ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠ² ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. ΠΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π³Π°ΡΠ°Π½ΡΠΈΠΉ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ "ΠΏΠΎΠΌΠ΅ΡΠΈΡΡ ΡΡΠ΅ΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ" (ΡΠΌ. ΠΏΡΠΈΠΌΠ΅ΡΡ) ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ°Π»ΠΎ ΡΠΌΡΡΠ»Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ ΡΡΠ΅ΡΡΠΈΠΌ.
ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ, Π½Π°ΠΏΠΈΡΠ°Π² ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΡΡΠ»ΠΎΠΊ. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ ΠΌΠΎΠ³ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ ΠΏΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ (ΡΠΌ. [Sutter02]). ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ Π²ΡΠΎΡΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΡΠ΅Π³Π΄Π° ΠΎΠ±ΡΡΠ²Π»ΡΠΉΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° operator() ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΌΠΎΠ³ ΠΏΠΎΠΌΠΎΡΡ Π²Π°ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠ΅ΠΉ, Π²ΡΠ²ΠΎΠ΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π»ΡΠ±ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Ρ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°. ΠΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅ΡΠ΅ΡΡ Π²ΡΠ΅ Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΠΎΡΡΡΠΏ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΌ Π΄Π°Π½Π½ΡΠΌ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΡΠΈΠΌΠ΅ΡΡΠΡΠΈΠΌΠ΅Ρ. FlagNth. ΠΠ΅ΡΠ΅Π΄ Π²Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· [Sutter02], Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠ΄Π°Π»ΠΈΡΡ ΡΡΠ΅ΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° v.
class FlagNth {
public:
FlagNth(size_t n) : current_(0), n_(n) { }
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΡΠ΅ΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅
template<typename T>
bool operator()(const T&) // ΠΠ»ΠΎΡ ΠΎ: Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ
{ return ++current_ == n_; } // ΡΡΠ½ΠΊΡΠΈΡ
private:
size_t current_, n_;
};
// ... ΠΏΠΎΠ·ΠΆΠ΅ ...
v.erase(remove_if(v.begin(), v.end(), FlagNth(3)));
Π£Π²Ρ, Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ΅ΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ STL ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π°ΡΡΠ΄Ρ Ρ ΡΡΠ΅ΡΡΠΈΠΌ ΡΠ΄Π°Π»ΠΈΡ ΠΈ ΡΠ΅ΡΡΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ remove_if ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ find_if ΠΈ remove_copy_if, ΠΈ ΠΊΠΎΠΏΠΈΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅Π²Π΅ΡΠ΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ remove_if Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠ΄Π°Π»ΠΈΡ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΊΡΠΈΡΠ΅ΡΠΈΡ. ΠΠ½ Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠ΅Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠ²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΠ±Ρ ΠΎΠ΄ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈ, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ.
ΠΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° β Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π΅Π³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ erase.
Π‘ΡΡΠ»ΠΊΠΈ[Austern99] Β§4.2.2 β’ [Josuttis99] Β§5.8.2, Β§8.1.4 β’ [Meyers01] Β§39 β’ [Stroustrup00] Β§10.2.6 β’ [Sutter02] Β§2-3
88. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡΠΎΠ² Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π° Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π° Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡΡ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡ ΠΈ, Π²ΠΎΠΏΡΠ΅ΠΊΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡΠΌ, ΠΎΠ±ΡΡΠ½ΠΎ Π΄Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠΉ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΠΊΠΎΠ΄.
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ (ΠΈ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΈΡ ΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ β ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 89). ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ Π³ΠΎΡΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π»Ρ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ "ΠΎΠ±Π΅ΡΡΠΊΠ°" ΠΈΠ· ptr_fun ΠΈΠ»ΠΈ mem_fun. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠ°Ρ ΠΎΠ±Π΅ΡΡΠΊΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ²ΡΠ·ΡΠ²Π°ΡΠ΅Π»Π΅ΠΉ (ΡΠΌ. ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 84):
inline bool isHeavy(const Thing&) { /* ... */ }
find_if(v.begin(), v.end(), not1(IsHeavy)); // ΠΡΠΈΠ±ΠΊΠ°
ΠΠ±ΠΎΠΉΡΠΈ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ptr_fun (ΠΈΠ»ΠΈ, Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π°, mem_fun ΠΈΠ»ΠΈ mem_fun_ref), ΡΡΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅:
inline bool IsHeavy(const Thing&) { /* ... */ }
find_if(v.begin(), v.end(),
not1(ptr_fun(IsHeavy))); // ΠΠ΅ΡΠΎΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠΎΠΏΡΡΠΊΠ°...
ΠΠ΅Π΄Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎΡ ΡΠΏΠΎΡΠΎΠ± Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ²Π½ΠΎ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° ptr_fun. ΠΠΎΡΠΎΡΠΊΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ptr_fun ΡΠΎΡΠ½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΈΠΏΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΡΠΈΠΏ (Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΠΈΠΏ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ ΠΊΠ°ΠΊ const Thing&) ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΏΡΡΠ°Π΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΡΡΠ³ΠΎΠΉ &, Π° ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΡΡΠ»ΠΊΡ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π² C++ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π°. ΠΠΌΠ΅ΡΡΡΡ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΡΠ·ΡΠΊΠ° ΠΈ/ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΡΡΠ»ΠΊΠ΅ Π½Π° ΡΡΡΠ»ΠΊΡ ΡΠ²Π΅ΡΠ½ΡΡΡΡΡ Π² ΠΎΠ±ΡΡΠ½ΡΡ ΡΡΡΠ»ΠΊΡ; ΡΠΌ. ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 89), Π½ΠΎ Π½Π° ΡΠ΅Π³ΠΎΠ΄Π½ΡΡΠ½ΠΈΠΉ Π΄Π΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΅ΡΠ΅Π½Π½ΠΎΠΉ.
ΠΡΠΈΠ±Π΅Π³Π°ΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΡΠΈΠΌ ΡΡ ΠΈΡΡΠ΅Π½ΠΈΡΠΌ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΈΠ·Π»ΠΈΡΠ½Π΅, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 89), ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°:
struct IsHeavy : unary_function<Thing, bool> {
bool operator()(const Thing&) const { /* ... */ }
};
find_if(v.begin(), v.end(), not1(IsHeavy())) ; // OK
ΠΡΠ΅ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠΎ, ΡΡΠΎ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π² Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π° Π½Π΅ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°:
bool CompareThings(const Thing&, const Thing&);
set<Thing, CompareThings> s; // ΠΡΠΈΠ±ΠΊΠ°
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ:
struct CompareThings
: public binary_function<Thing,Thing,bool> {
bool operator()( const Thing&, const Thing& ) const;
};
set<Thing, CompareThings> s; //OK
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΈΠΌΠ΅Π΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² β ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π½Π°ΠΊΠΎΠΌΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ:
template<typename Iter, typename Compare>
Iter find_if(Iter first, Iter last, Compare comp);
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΡ
inline bool Function(const Thing&) { /* ... */ }
find_if(v.begin(), v.end(), Function);
ΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π° ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΡΠ΅Π΄ΠΊΠΎ Π²ΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΡΠ°ΠΊΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ (Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π΅ΠΆΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π°Π½Π°Π»ΠΈΠ· Π²ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠ΅Π»ΠΎΠΌ), Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ ΠΈ Π²ΠΈΠ΄ΠΈΠΌΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π²ΡΠ·ΠΎΠ²Π° find_if. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ, ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ find_if Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ:
struct FunctionObject : unary_function<Thing, bool> {
bool operator()(const Thing&) const { /* ... */ }
};
find_if(v.begin(), v.end(), FunctionObject());
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ (ΡΠ²Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠ²Π½ΠΎ) Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ operator(), ΡΠΎ ΡΠ°ΠΊΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π‘++ ΡΠΏΠΎΡΠΎΠ±Π½Ρ Π΄Π΅Π»Π°ΡΡ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΌΠΈ ΡΠΆΠ΅ ΠΎΡΠ΅Π½Ρ Π΄Π°Π²Π½ΠΎ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. ΠΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠ΅ΠΉ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 8); Π΅Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 9). ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ Π³ΠΎΡΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ β ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π΅Π΅ (ΠΊΡΠΎΠΌΠ΅ ΡΠ΅Ρ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±Π΅ΡΠ½ΡΡΡ Π΅Π΅ Π² ptr_fun ΠΈΠ»ΠΈ mem_fun). ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°, ΡΠΎ Π»ΡΡΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ.
Π‘ΡΡΠ»ΠΊΠΈ[Austern99] Β§4, Β§8, Β§15 β’ [Josuttis99] Β§5.9 β’ [Meyers01] Β§46 β’ [Musser01] Β§8 β’ [Sutter04] Β§25
89. ΠΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ
Π Π°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅. Π’Π°ΠΌ, Π³Π΄Π΅ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π΅Π»Π°ΠΉΡΠ΅ ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ ΠΏΡΡΠ΅ΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡ unary_function ΠΈΠ»ΠΈ binary_function.
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈ ΡΠΎ ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π΅Π»Π°ΡΡ ΠΈ Π²Π°ΡΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
template<class InputIter, class Func>
Function for_each(InputIter first, InputIter last, Function f);
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π»Π΅Π³ΠΊΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ Π±ΡΡΡ ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠ½ΡΠΌΠΈ (Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ ΡΡΠ΅Π·ΠΊΠΈ), ΡΠ°ΠΊ ΡΡΠΎ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 54). ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Ρ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΈ/ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ β ΠΈΡ ΡΠΎΠΆΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ; ΠΏΡΠΎΡΡΠΎ ΡΠΊΡΠΎΠΉΡΠ΅ ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ΄ΠΈΠΎΠΌΡ Pimpl (ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ; ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 43). ΠΡΠ° ΠΈΠ΄ΠΈΠΎΠΌΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΌΠ°Π»ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ Π±ΠΎΠ³Π°ΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ»Π°ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ.
β’ ΠΡΡΡ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡΠΌ. ΠΠ°ΡΠ»Π΅Π΄ΡΠΉΡΠ΅ Π΅Π³ΠΎ ΠΎΡ unary_function ΠΈΠ»ΠΈ binary_function.
β’ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ΄ΠΈΠΎΠΌΡ Pimpl. Π’Π°ΠΊΠΎΠΉ ΠΊΠ»Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, shared_ptr) Π½Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°) ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ.
β’ ΠΠΌΠ΅ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ(Ρ) Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ-ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.