рдПрд╕рдЯреАрдбреА рдХреА рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ :: рд╕реВрдЪреА рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд░ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ

рдПрдХ рджреЛрд╣рд░реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдПрдХ рдореВрд▓рднреВрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдФрд░ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реИрдЦрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬреЛ рдирд┐рд░рдВрддрд░ рд╣реЛрддреА рд╣реИрдВ ...

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдХрд╛рд░ () рдлрд╝рдВрдХреНрд╢рди рдХрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИ?
"рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ - рдУ (1)!" рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ, "рдХреНрдпрд╛ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?"

size_type size() const { return _size; } 


рддреБрдЪреНрдЫ, рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд╣реИ рдирд╛?
рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛, рдЖрдк рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреАрдПрдирдпреВ рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрдирдХреА рдПрдХ рдЕрд▓рдЧ рд░рд╛рдп рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░ gcc 4.x рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 /** Returns the number of elements in the %list. */ size_type size() const { return std::distance(begin(), end()); } 

рдпрджрд┐ рдЖрдк рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдЕрдкрдиреЗ рд╡рд┐рддрд░рдг рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░реЗрдВред

рд╣рдо рдпрд╣рд╛рдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рддреБрдЪреНрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рд╕реВрдЪреА рдЧрд┐рдирддреА рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдкрд╛рд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧреА!

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



 for (std::list <int>::const_iterator I = my_list.begin (); I != my_list.end (); ++I) { if (*I > my_list.size ()) { std::cout << "Haha! "<< *I << std::endl; } } 

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ O (N) рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдпрд╣рд╛рдБ O (N ^ 2) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ 100 рдЖрдЗрдЯрдо рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЕрдЧрд░ 1,000,000?

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдЖрдХрд╛рд░ () рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред



 std::list <int> my_list; // Thread 1 void thread1_proc () { while (!stop) { std::cout << "List size: " << my_list.size () << std::endl; } } // Thread 2 void thread2_proc () { while (!stop) { int n = rand () my_list.push_back (n); if (n % 2) my_list.pop_front (); } } 

рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛрдиреЗ рдХрд╛ рдЧрдВрднреАрд░ рдЦрддрд░рд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рднреА рдпрд╣реА рд╣реИ




рддреЛ рдХреНрдпрд╛ GNU рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рд╕реВрдЪреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ?


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ _size рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдХрдореА рд╕реЗ рдмреНрдпрд╛рд╣ рдХреЛ O (1) рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ O (N) рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред

рд╡рд┐рднрд╛рдЬрди рдПрдХ рддрддреНрд╡ рд╕реЗ рджреВрд╕рд░реА рд╕реВрдЪреА рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдирдП рдЖрдХрд╛рд░реЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдиреЛрдб рд╕реЗ рджреВрд╕рд░реЗ рдиреЛрдб рдкрд░ "рд╕реНрд╡рд┐рдЪ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЕрд░реНрдерд╛рдд рд▓рдЧрд╛рддрд╛рд░ рд╕рдордп рдХреЗ рд▓рд┐рдПред

рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЛ _size рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рддрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреЛрдиреЛрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдРрд╕рд╛ рдХрд╛рд░рдг рд╣реИред рд╡реИрд╕реЗ, рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА?

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдФрд░ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдиреНрдп рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рдЪрд░ _ рдЖрдХрд╛рд░ (рдФрд░) рддрджрдиреБрд╕рд╛рд░ рдУ (1) рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рджреЛ рдмрд╛рд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдкрд░ рдЭреБрдХрддрд╛ рд╣реВрдВред рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ рд╡рд╛рдирд╕реНрдкрддрд┐рдХ рдкрдж рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдпреБрдкреАрдбреА
рдирдП C ++ 11 рдорд╛рдирдХ рдореЗрдВ O (1) рдХреЗ рд▓рд┐рдП рд╕рднреА STL рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреАрдПрдирдпреВ рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдмрд╛рдЗрдирд░реА рд╕рдВрдЧрддрддрд╛ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдм рддрдХ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдкрдврд╝реЗрдВ gcc.gnu.org/bugzilla/show_bug.cgi?id=49561

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


All Articles