рдПрдХ рджреЛрд╣рд░реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдПрдХ рдореВрд▓рднреВрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдФрд░ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реИрдЦрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬреЛ рдирд┐рд░рдВрддрд░ рд╣реЛрддреА рд╣реИрдВ ...
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдХрд╛рд░ () рдлрд╝рдВрдХреНрд╢рди рдХрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИ?
"рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ - рдУ (1)!" рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ, "рдХреНрдпрд╛ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?"
size_type size() const { return _size; }
рддреБрдЪреНрдЫ, рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд╣реИ рдирд╛?
рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛, рдЖрдк рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреАрдПрдирдпреВ рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрдирдХреА рдПрдХ рдЕрд▓рдЧ рд░рд╛рдп рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ gcc 4.x рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
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;
рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛрдиреЗ рдХрд╛ рдЧрдВрднреАрд░ рдЦрддрд░рд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рднреА рдпрд╣реА рд╣реИ
- рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреВрд░реНрдг рдкрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдПрдХ рддреБрдЪреНрдЫ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 90% рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рд╕реЗред
- рдХрдо рдХреБрд╢рд▓ рдЖрдХрд╛рд░ред рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ
1. рдЖрдХрд╛рд░ рдореЗрдВ рдХрдореАред рдпрджрд┐ рд╕реВрдЪреА рдХрд╛ рдЖрдХрд╛рд░ рд╣рдореЗрдВ рдЬреНрдЮрд╛рдд рд╣реИ (O (1 рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ) рдкрдврд╝реЗрдВ), рддреЛ рд╣рдо рдпрд╣ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╢реБрд░реБрдЖрдд рд╕реЗ рдпрд╛ рдЕрдВрдд рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЕрдВрдд рдореЗрдВ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдЬреАрдПрдирдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
2. рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ред рдпрджрд┐ рд╕реВрдЪреА рдХрд╛ рдЖрдХрд╛рд░ рд╣рдореЗрдВ рдЬреНрдЮрд╛рдд рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╕ рдЧрд╛рдпрдм рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЬреАрдПрдирдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕реВрдЪреА рдкрд░ рдПрдХ рдкреВрд░реНрдг рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реЛ, рдореБрдЭреЗ рдмрддрд╛рдУред
рддреЛ рдХреНрдпрд╛ GNU рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рд╕реВрдЪреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ?
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ _size рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдХрдореА рд╕реЗ рдмреНрдпрд╛рд╣ рдХреЛ O (1) рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ O (N) рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред
рд╡рд┐рднрд╛рдЬрди рдПрдХ рддрддреНрд╡ рд╕реЗ рджреВрд╕рд░реА рд╕реВрдЪреА рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдирдП рдЖрдХрд╛рд░реЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдиреЛрдб рд╕реЗ рджреВрд╕рд░реЗ рдиреЛрдб рдкрд░ "рд╕реНрд╡рд┐рдЪ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЕрд░реНрдерд╛рдд рд▓рдЧрд╛рддрд╛рд░ рд╕рдордп рдХреЗ рд▓рд┐рдПред
рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЛ _size рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рддрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреЛрдиреЛрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдРрд╕рд╛ рдХрд╛рд░рдг рд╣реИред рд╡реИрд╕реЗ, рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА?
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдФрд░ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдиреНрдп рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рдЪрд░ _ рдЖрдХрд╛рд░ (рдФрд░) рддрджрдиреБрд╕рд╛рд░ рдУ (1) рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рджреЛ рдмрд╛рд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рдЗрд╕ рдкрд░ рдЭреБрдХрддрд╛ рд╣реВрдВред рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ рд╡рд╛рдирд╕реНрдкрддрд┐рдХ рдкрдж рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред
рдпреБрдкреАрдбреАрдирдП C ++ 11 рдорд╛рдирдХ рдореЗрдВ O (1) рдХреЗ рд▓рд┐рдП рд╕рднреА STL рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреАрдПрдирдпреВ рдПрд╕рдЯреАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдмрд╛рдЗрдирд░реА рд╕рдВрдЧрддрддрд╛ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдм рддрдХ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдкрдврд╝реЗрдВ gcc.gnu.org/bugzilla/show_bug.cgi?id=49561