
рдореИрдВ рдЬреБрд▓рд╛рдИ рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдУрд╣ рд╡рд┐рдбрдВрдмрдирд╛ , рддрдп рдХрд░реЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдПред рдХреЗрдкрдЯ рдЧреНрд░реЗрдЧрд░реА рдХреА 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) {
рд╣рдордиреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИ, рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рддреАрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕рд░рдгреА рдХреЗ рдмрд╛рд╣рд░ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реИрдВ!
рдмреЗрд╢рдХ, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╕реА ++ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рд╣реА рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рдЗрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, 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());
рд╡рд╣рд╛рдБ рднреА рд╣реИ 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());
рдФрд░ рдЕрднреА рднреА 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());
рдХреЗрдЯ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ 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
, рдФрд░ рдпрд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред
рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреМрди рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╣ рдЙрдирд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдХреЗрдЯ рдиреЗ рдХрд╣рд╛ рдерд╛, рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред