рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдирд╛рдо рдФрд░ рдкрд░рд┐рдгрд╛рдо рдирд╛рдо


рдореИрдВ рдЬреБрд▓рд╛рдИ рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдУрд╣ рд╡рд┐рдбрдВрдмрдирд╛ , рддрдп рдХрд░реЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдПред рдХреЗрдкрдЯ рдЧреНрд░реЗрдЧрд░реА рдХреА CppCon рдореЗрдВ рдмрд╛рдд рдХреЗ рдмрд╛рдж рд╣реА рдореЗрд░реЗ рдорди рдореЗрдВ рд╕рдлрд▓ рд╢рдмреНрдж рдЖрдП, рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред


рдмреЗрд╢рдХ, рдРрд╕реЗ рдирд╛рдо рд╣реИрдВ рдЬреЛ рд╕реВрдЪрдирд╛ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ int f(int x) ред рдЙрдиреНрд╣реЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдХрднреА-рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднрд░реА рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИред


рдЙрджрд╛рд╣рд░рдг 1: std :: log2p1 ()


C ++ 20 рдореЗрдВ, рдмрд┐рдЯ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдХрдИ рдирдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЗрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП, рджреВрд╕рд░реЛрдВ рдореЗрдВ std::log2p1 ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 int log2p1(int i) { if (i == 0) return 0; else return 1 + int(std::log2(x)); } 

рдЕрд░реНрдерд╛рддреН, рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд▓рдШреБрдЧрдгрдХ рдкреНрд▓рд╕ 1 рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ 0 рдХреЗ рд▓рд┐рдП рдпрд╣ 0. рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ if / else рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреВрд▓ рдХрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИ - рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдмрд┐рдЯреНрд╕ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдорд╛рди рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред


рдЙрджрд╛рд╣рд░рдг 2: рдПрд╕рдЯреАрдбреА :: рдЖрд╢реАрд░реНрд╡рд╛рдж ()


рдЕрдм рдпрд╣ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛


рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░: C ++ рдореЗрдВ, рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗрд╡рд▓ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ: рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдбрд╝реЛрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕реЗрдЯ рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдФрд░ "рджрд╕ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЪрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ"ред рдпрд╣ рдЕрд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред


 int obj = 0; int* ptr = &obj; ++ptr; //   

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдз рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЛ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ std::vector<T>::reserve() рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ std::vector<T>::reserve() :


 void reserve(std::size_t n) { //      auto new_memory = (T*) ::operator new(n * sizeof(T)); //    тАж //   auto size = this->size(); begin_ = new_memory; //   end_ = new_memory + size; //     end_capacity_ = new_memory + n; //    } 

рд╣рдордиреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИ, рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рддреАрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕рд░рдгреА рдХреЗ рдмрд╛рд╣рд░ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реИрдВ!


рдмреЗрд╢рдХ, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╕реА ++ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рд╣реА рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рдЗрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, P0593 рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдорд╛рдирдХ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ ::operator new рдФрд░ std::malloc ) рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдмрд┐рдВрджреБ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рдмрди рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрднреА рднреА рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ, рдПрдХ рд╕реЗрдХрдВрдб рд░реБрдХреЛред


рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА, рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, deallocate() рдлрд╝рдВрдХреНрд╢рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореГрдд рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реВрдЪрдХ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, P0593 рдиреЗ рдлрд╝рдВрдХреНрд╢рди std::bless(void* ptr, std::size_t n) (рд╡рд╣рд╛рдБ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдерд╛, рдЬрд┐рд╕реЗ bless рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рднреМрддрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред


рдирд╛рдо std::bless рдЕрд╕реНрдерд╛рдпреА рдерд╛ред


рддреЛ, рдирд╛рдоред


рдХреЛрд▓реЛрди рдореЗрдВ, LEWG рдХреЛ рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдХрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд┐рдХрд▓реНрдк implicitly_create_objects() рдФрд░ implicitly_create_objects_as_needed() рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд░рддрд╛ рд╣реИред


рдореБрдЭреЗ рдпреЗ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдирд╣реАрдВ рдереЗред


рдЙрджрд╛рд╣рд░рдг 3: std :: рдЖрдВрд╢рд┐рдХ_sort_copy ()


рдХреЗрдЯ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг


рдПрдХ рдлрд╝рдВрдХреНрд╢рди std::sort , рдЬреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ std::sort рдХрд░рддрд╛ рд╣реИ:


 std::vector<int> vec = {3, 1, 5, 4, 2}; std::sort(vec.begin(), vec.end()); // vec == {1, 2, 3, 4, 5} 

рд╡рд╣рд╛рдБ рднреА рд╣реИ std::partial_sort , рдЬреЛ рддрддреНрд╡реЛрдВ рдХреЗ рдХреЗрд╡рд▓ рднрд╛рдЧ рдХреЛ std::partial_sort рдХрд░рддрд╛ рд╣реИ:


 std::vector<int> vec = {3, 1, 5, 4, 2}; std::partial_sort(vec.begin(), vec.begin() + 3, vec.end()); // vec == {1, 2, 3, ?, ?} ( ...4,5,  ...5,4) 

рдФрд░ рдЕрднреА рднреА std::partial_sort_copy , рдЬреЛ рддрддреНрд╡реЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреА рд╕реЙрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдиреЛрдВ рдХреЛ рдирдП рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:


 const std::vector<int> vec = {3, 1, 5, 4, 2}; std::vector<int> out; out.resize(3); std::partial_sort_copy(vec.begin(), vec.end(), out.begin(), out.end()); // out == {1, 2, 3} 

рдХреЗрдЯ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ std::partial_sort_copy рдПрдХ рддрдерд╛рдХрдерд┐рдд рдирд╛рдо рд╣реИ, рдФрд░ рдореИрдВ рдЙрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдирд╛рдо рдФрд░ рдкрд░рд┐рдгрд╛рдо рдирд╛рдо


рд╕реВрдЪреАрдмрджреНрдз рдирд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА, рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдЧрд▓рдд : рд╡реЗ рд╕рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред std::log2p1() рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ; implicitly_create_objects() рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ std::partial_sort_copy() рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдпреЗ рд╕рднреА рдирд╛рдо рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмреЗрдХрд╛рд░ рд╣реИрдВ ред


рдХреЛрдИ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рдмреИрдарддрд╛ рд╣реИ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ "рдХрд╛рд╢ рдореИрдВ рдмрд╛рдЗрдирд░реА рд▓реЙрдЧрд░рд┐рджрдо рд▓реЗ рд╕рдХрддрд╛ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддрд╛"ред рдЙрд╕реЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХрд┐рддрдиреЗ рдмрд┐рдЯреНрд╕ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╡рд╣ bit_width рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЕрд╕рдлрд▓ рд░реВрдк рд╕реЗ рдбреЙрдХ рдЦреЛрдЬрддрд╛ рд╣реИред рдЬрдм рддрдХ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддрдм рддрдХ рдмрд╛рдЗрдирд░реА рд▓реЙрдЧрд░рд┐рдердо рдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ, рдЙрд╕рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рджрд┐рдпрд╛ (рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЫреВрдЯ рдЧрдпрд╛)ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ std::log2p1 рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЪрдорддреНрдХрд╛рд░ рдирд┐рдХрд▓рд╛, рддреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдЕрдЧрд▓реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред bit_width(max_value) рдХреЛ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред


рдЗрд╕реА рддрд░рд╣, рдХрд┐рд╕реА рдХреЛ рднреА "рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП" рдпрд╛ "рд╡реЗрдХреНрдЯрд░ рдХреА рдХреЙрдкреА рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ 5 рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ recycle_storage() (рдЬрд┐рд╕реЗ рдирд╛рдо std::bless ) рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ top_n_sorted() рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред


Kate рд╢рдмреНрдж std::partial_sort_copy() рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЙрдирдХреЗ рдирд╛рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╕рд┐рд░реНрдл рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЖрдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рд╕реНрдореГрддрд┐ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдЕрдкрдиреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдиреАрд▓реЗ рд░рдВрдЧ рд╕реЗ рдмрд╛рд╣рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдЙрд╕рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреАрдЪ рдЧрд▓рддрдлрд╣рдореА рдкреИрджрд╛ рдХрд░рдирд╛ред рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдФрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд░реНрдирд┐рдпрд╛рдВ, рд╣рд╛рдВред рд▓реЗрдХрд┐рди std::log2p1() рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрднреА-рдХрднреА рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг 4: std :: popcount ()


std::popcount() , рдЬреИрд╕реЗ std::log2p1() , C ++ 20 рдореЗрдВ рдЗрд╕реЗ <bit> std::log2p1() <bit> рдЬреЛрдбрд╝рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред рдФрд░ рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рд░реВрдк рд╕реЗ рдмреБрд░рд╛ рдирд╛рдо рд╣реИред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рди рдХреЗрд╡рд▓ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рднреНрд░рдорд┐рдд рд╣реИ (рдирд╛рдо рдореЗрдВ рдкреЙрдк рд╣реИ, рд▓реЗрдХрд┐рди рдкреЙрдк / рдкреБрд╢ рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ) - рдЬрдирд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рдирд╛ (рдЬрдирд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрд┐рдирддреА? рдЖрдмрд╛рджреА рдХреА рд╕рдВрдЦреНрдпрд╛?) рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рджреВрд╕рд░реА рдУрд░, std::popcount() рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЕрд╕реЗрдВрдмрд▓реА рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдкреЙрдкрдХрд╛рдЙрдВрдЯ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдЗрд╕рдХрд╛ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рд╣реИред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рднрд╛рд╖рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмреАрдЪ рдХреА рдЦрд╛рдИ рдЙрддрдиреА рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИред рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдЬреЛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╢рдмреНрдж рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рда рдХреЗ рджрд╢рдХ рд╕реЗ рдПрдХ рдкреЙрдкрдХрд╛рдЙрдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирддрд╛ рд╣реИ, рдРрд╕рд╛ рдирд╛рдо рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИред


рд╡реИрд╕реЗ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓: рдХреНрдпрд╛ рдЖрдк рдЙрди рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЬреЛ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ, рдпрд╛ рдкреБрд░рд╛рдиреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рдЪрд┐рдд рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ?


рд╣реИрдкреНрдкреА рдПрдВрдб?


P1956 рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдирд╛рдо рдмрджрд▓рдирд╛ std::log2p1() to std::bit_width() ред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ C ++ 20 рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред std::ceil2 рдФрд░ std::floor2 рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдХреНрд░рдорд╢рдГ std: bit_ceil () рдФрд░ std :: bit_floor () рднреА рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдирдХреЗ рдкреБрд░рд╛рдиреЗ рдирд╛рдо рднреА рдмрд╣реБрдд рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗред


рдХреЛрд▓реЛрди рдореЗрдВ LEWG рдиреЗ рдпрд╛ рддреЛ implicitly_create_objects[_as_needed] рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рди рд╣реА std::bless рд▓рд┐рдП рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ recycle_storage std::bless ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдорд╛рдирдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд┐рдВрдЧ std::recycle_storage() рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛрдЧрд╛ред рдПрдХ рдФрд░ std::bless() рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм start_lifetime_as рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╣ рдкрд╕рдВрдж рд╣реИред рдЗрд╕реЗ C ++ 23 рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдмреЗрд╢рдХ, std::partial_sort_copy() рдЕрдм рдирд╛рдо рдирд╣реАрдВ std::partial_sort_copy() - рдЗрд╕ рдирд╛рдо рдХреЗ рддрд╣рдд рдпрд╣ 1998 рдореЗрдВ рдорд╛рдирдХ рд╡рд╛рдкрд╕ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо std::log2p1 рддрдп рдХрд┐рдпрд╛ std::log2p1 , рдФрд░ рдпрд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред


рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреМрди рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╣ рдЙрдирд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдХреЗрдЯ рдиреЗ рдХрд╣рд╛ рдерд╛, рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/hi484860/


All Articles