рдПрдХ рдХрдВрдЯреЗрдирд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдЖрдЗрдЯрдо рдХреЙрдкреА рдХрд░реЗрдВ? рдХреБрдЫ рднреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо 5 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:
template<class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) { while(first != last) *result++ = *first++; return result; }
рдЖрдкрдиреЗ
cplusplus.com рд╕реЗ std :: copy рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрд╛рди рд▓рд┐рдпрд╛ рд╣реЛрдЧрд╛ред GNU STL рдХрд╛ std рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ :: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ 139 рд▓рд╛рдЗрдиреЗрдВ рд▓реЗрддреА рд╣реИ? рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
STL рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА:
- рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐
- рд╕рдВрдХрд▓рдХ-рдЬрдирд┐рдд рдХреЛрдб рдЖрдХрд╛рд░
- рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд
- рд╕рдВрдХрд▓рди рдХреА рдЧрддрд┐
рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐
рдпрджрд┐ рдЖрдк рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рддреБрдЪреНрдЫ рдХреЙрдкреА рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдирд┐рд░рдВрддрд░ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИрдВ, рддреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдореЛрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ std :: copy рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди memcpy рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ memcpy рдХреЗрд╡рд▓ рдЧреИрд░-рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо std :: copy: рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдПрдХ рдЙрдкрд╡рд╛рд╕, рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ, рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдПред
SFINAE
рдФрд░ рдпрд╣рд╛рдБ "рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд┐рдлрд▓рддрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд╣рд╛рдпрддрд╛ рдЖрддрд╛ рд╣реИред рдпрджрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЧрд▓рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреИрдЯрд░реНрди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЧрд▓рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ std :: enable_if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
std :: enable_if
Enable_if рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрд╣ рдПрдХ рдЕрднрд┐рдиреНрди рдирд┐рд░рдВрддрд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред рдпрджрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕рддреНрдп рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреА рдШреЛрд╖рдгрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЦрд╛рд▓реА рд╣реИред
// Define a nested type if some predicate holds. // Primary template. /// enable_if template<bool, typename _Tp = void> struct enable_if { }; // Partial specialization for true. template<typename _Tp> struct enable_if<true, _Tp> { typedef _Tp type; };
рдЯрд╛рдЗрдк
std::enable_if<, Type>::type
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╣рд╛рд▓рдд рд╕рдЪ рд╣реИред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
// template<class T> std::enable_if<false, T>::type get_t() {return T();} // template<class T> std::enable_if<true, T>::type get_t() {return T();}
рдкреНрд░рдХрд╛рд░ рд▓рдХреНрд╖рдг
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд░ рд▓рдХреНрд╖рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдЙрд╕ рдореВрд▓реНрдп рдкрд░ рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЖрдВрд╢рд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрд╕рдЯреАрдбреА рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди :: рдХреЙрдкреА
рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕реЗ рдкрд╣рд▓реЗ , рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ:
template<class T> // gcc 4.5 std::is_trivially_copiable, //inline typename std::enable_if<std::is_trivially_copiable<T>::value, T*>::type inline typename std::enable_if<std::is_trivial<T>::value, T*>::type copy(T* first, T* last, T* result) { const ptrdiff_t num = last - first; memmove(result, first, sizeof(T) * num); return result + num; }
рдпрджрд┐ рдХреЙрдкреА рдХреЛ рддреАрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдЗрд╕ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдХ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ std :: copy рдореЗрдВ рджреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реЗрд╡рд╛ рдирд╛рдореЛрдВ рдХреЗ рддрд╣рдд рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ std :: рдореЗрдВ рд╣реА рдХрджрдо рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
#include <type_traits> #include <cstring> // : C++11. // C++03 type_traits ( ) // . // is_simple, memmove, . // . template<bool is_simple> struct __do_copy; // , _. // . // , // . std::copy template<> struct __do_copy<true> { // // , // memmove . template<class InputIterator, class OutputIterator> static inline OutputIterator do_copy(InputIterator first, InputIterator last, OutputIterator result) { typedef typename std::iterator_traits<InputIterator>::value_type ValueType; const std::ptrdiff_t num = last - first; memmove(result, first, sizeof(ValueType) * num); return result + num; } }; template<> struct __do_copy<false> { // template<class InputIterator, class OutputIterator> static inline OutputIterator do_copy(InputIterator first, InputIterator last, OutputIterator result) { while(first != last) *result++ = *first++; return result; } }; // trait // STL template<typename, typename> struct are_same : public std::false_type {}; template<typename Tp> struct are_same<Tp, Tp>: public std::true_type {}; template<class InputIterator, class OutputIterator> inline InputIterator copy( InputIterator first, InputIterator last, OutputIterator result) { // typename , value_type // , , . . typedef typename std::iterator_traits<InputIterator>::value_type ValueTypeI; typedef typename std::iterator_traits<OutputIterator>::value_type ValueTypeO; const bool is_simple = ( std::is_trivial<ValueTypeI>::value && std::is_pointer<InputIterator>::value && std::is_pointer<OutputIterator>::value && are_same<ValueTypeI, ValueTypeO>::value); // return __do_copy<is_simple>::do_copy(first, last, result); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреАрдПрдирдпреВ рдПрд╕рдЯреАрдПрд▓ рдПрдХ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрднрд┐рдЧрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕реЗ рдЪрдХреНрд░реЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЧрддрд┐ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред
рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдПрдХ рдШрдЯрд╛рд╡ рдФрд░ рдПрдХ рдЬреЛрдбрд╝ рдореЗрдВ рдШрдЯрддрд╛ рд╣реИ, рдФрд░ рдореЗрдореЛрд╡ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдпрд╣реА рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХреА рддрд░рдХреАрдмреЗрдВ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ: рд╡реЗ рд╣рд┐рд╕реНрд╕реЗ рдЬреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, std :: рд╕реВрдЪреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдФрд░ рдЙрди рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдВрдХ рдмреЗрд╕ рдЧреИрд░-рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдиреИрддрд┐рдХ рд╕рд░рд▓ рд╣реИ: рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдпрдерд╛рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ
рдЕрдзрд┐рдХ рдХреБрд╢рд▓, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рддрд╛
рд╣реИ ред
рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдирд┐рдпрдорд┐рдд рдХреЛрдб рдореЗрдВ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЖрдк рдПрдХ рджрд░реНрдЬрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ? рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдЪрд┐рдд рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкреБрдирд╢реНрдЪ
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ std :: copy рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо start рдФрд░ finish рдХреЗ рдмреАрдЪ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрдореЛрд╡ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рджрд┐рд╢рд╛ (рд╢реБрд░реБрдЖрдд рд╕реЗ рдЕрдВрдд рддрдХ рдпрд╛ рдЕрдВрдд рд╕реЗ рд╢реБрд░реБрдЖрдд рддрдХ) рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрддрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдПрд╕рдЯреАрдПрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд░реНрдерд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░рд┐рд▓реАрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЧреНрд▓рд┐рдмрдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рдХрд╛рдо рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред