C ++ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ Linq

рдкрд░рд┐рдЪрдп


рд▓рдВрдмреЗ рдмреНрд░реЗрдХ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд▓реМрдЯрдирд╛ рдкрдбрд╝рд╛ред C # рдХреЗ рдмрд╛рдж, var рдХреАрд╡рд░реНрдб рдФрд░ linq рдХреНрд╡реЗрд░реАрдЬрд╝ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдХрдореА рдереАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдкреНрд░рдЧрддрд┐ рдЕрднреА рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореЗрд░реА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рджреМрд░рд╛рди C ++ 11 рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдирдИ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдерд╛ рдФрд░ рдореБрдЭреЗ рд▓рд┐рдирдХреНрд╕, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреА рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдорд┐рдВрдЧрд╡ рдХреЗ рд▓рд┐рдП рдЬреАрд╕реАрд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред рдПрдХ рд▓рд╛рдЗрдиреЗрдХ рдЬреИрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдЕрд╕рдлрд▓ рд░рд╣реА, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдШреБрдЯрдиреЗ рдкрд░ рдПрдХ рдЧреИрд░-рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╢рд┐рд▓реНрдк рдерд╛ред рдЗрд╕реНрддреАрдлрд╛ рджреЗ рджрд┐рдпрд╛, рдореИрдВрдиреЗ рдЦреЛрдЬ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдкреНрд░реИрд▓ 2012 рдореЗрдВ, C ++ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрд╕рд╛рд╣рдЬрдирдХ LINQ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдореБрдЭреЗ рдЕрдиреБрдХреВрд▓ рдерд╛ред рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдХрд░ рдФрд░ рдЗрд╕рдХреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЫрд╛рдВрдЯрдХрд░, рдореИрдВ рдЕрдХреНрд╖рдорддрд╛ рд╕реЗ рдирд┐рд░рд╛рд╢ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдмрдЪреА рдереА - рдПрдХ рд╣реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд▓рд╛рдареА рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ github.com/drbasic/CppLinq рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕реА рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдирд┐рд╖реНрдХрд╛рд╕рди (рдСрдЯреЛ) рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЫрд╛рдВрдЯрдирд╛ред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣-рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдорджрдж рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЧреНрд░рд╛рдл рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрди рдЧреНрд░рд╛рдл рдХреЛ рдХреЙрдкреА, рдкреВрд░рд╛, рд╕рдВрдпреБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╕реА # рджреБрдирд┐рдпрд╛ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирдХ рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рджреЛ рдмрд╛рд░ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ, рдореИрдВрдиреЗ C # рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛, рдПрдХ рд╕реНрдкрд╖реНрдЯ рд▓реЗрдлреНрдЯ рдЬреЙрдЗрди рдФрд░ рдлреБрд▓ рдЬреЙрдЗрди рдХреЛ рдЬреЛрдбрд╝рд╛ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реАрдорд╛ рд░реВрдкрд╛рдВрддрд░рдг рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдореВрд▓ рдЕрдиреБрдХреНрд░рдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдУрд░ рдЬрд╛ рд░рд╣реА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЬрдЯрд┐рд▓ рддрддреНрд╡реЛрдВ рд╕реЗ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдирдХрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдореВрд▓ рдЕрдиреБрдХреНрд░рдо "рдЖрднрд╛рд╕реА" рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рддрдХ, рдореВрд▓ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХрд╛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рддрддреНрд╡реЛрдВ рдХреЛ рд▓рд╛рдЗрдирдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд░рдгрд┐рдпрд╛рдБ, рдХреНрдпреВрдЯреА рдХрдВрдЯреЗрдирд░, рдПрд╕рдЯреАрдбреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░ :: рдмрд┐рдЯрд╕реЗрдЯ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рдореБрд╢реНрдХрд┐рд▓реЗрдВ рдХреЗрд╡рд▓ рдирд┐рд░рдВрддрд░ рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреИрджрд╛ рд╣реБрдИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдХрднреА рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдФрд░ 2012 рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, gcc 4.8, mingw 4.8ред рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд┐рдХрд▓рд╛, рдЬреАрд╕реАрд╕реА рдХреЛ рдЦреБрд╢ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдерд╛, рдФрд░ рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд┐рд░ рдЧрдП, рдХрднреА-рдХрднреА рдмрд┐рдирд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рдХреЗ рдЪрд┐рд▓реНрд▓рд╛рдП рднреАред

рд▓рдбрд╝рд╛рдИ рдореЗрдВ


рдЗрд╕рд▓рд┐рдП, CppLinq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо 10 рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд▓реЗрддреЗ рд╣реИрдВ, рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдХреНрд╖реЗрддреНрд░ iVal> 5, рдлрд╝реАрд▓реНрдб sVal рджреНрд╡рд╛рд░рд╛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ std :: рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ:

TestClass1 data[10]; auto t1 = Linq::from(data) .where([](const TestClass1 &a){return a.iVal >= 5; }) .orderBy([](const TestClass1 &a){return a.sVal; }) .toVector(); 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдПрдХ рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ, рдСрдкрд░реЗрдЯрд░ рдСрдкрд░реЗрдЯрд░ рдХреНрд░рдордмрджреНрдз рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЕрднреА рддрдХ рдХреЛрдИ рдбреЗрдЯрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдирд╡реЗрд╕реНрдЯрд░ рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред .рд╡реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЪреЗрди рдореЗрдВ рдЕрдВрддрд┐рдо рдлрд┐рд▓реНрдЯрд░ рд╕реЗ рдмрджрд▓реЗ рдореЗрдВ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреВрдЫрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЙрдирд╕реЗ std :: рд╡реЗрдХреНрдЯрд░ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдлрд┐рд▓реНрдЯрд░ рдСрд░реНрдбрд░рдмрд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рдВрдЬрд┐рдд рдлрд┐рд▓реНрдЯрд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЕрдиреБрдХреНрд░рдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдХреЗрдд, рдЙрдиреНрд╣реЗрдВ рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓рдХрд░ рдЙрдиреНрд╣реЗрдВ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВред рдЬрд╣рд╛рдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ "рдордХреНрдЦреА рдкрд░" рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рд╕реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдирдП рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкрдиреЗ overlying рдлрд┐рд▓реНрдЯрд░ рд╕реЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдкрд╛рддрд╛ред рдиреАрдЪреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рдПрдбрд╛рдкреНрдЯрд░ рд╕реЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХрд╛ рдкрддрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рддрддреНрд╡ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдордирд╛ рдХрд░ рджреЗрдЧрд╛ред

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

 auto src = Linq::from(data) .where([](const TestClass1 &a){return a.iVal >= 5; }); if (order == ascending) src = src.orderBy([](const TestClass1 &a){return a.sVal; }); else src = src.orderByDesc([](const TestClass1 &a){return a.sVal; }); auto result = src.toVector(); 


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

 auto t4 = Linq::from(src1) .orderByDesc([](const TestClass1 &a){return a.sVal; }) .thenBy([](const TestClass1 &a){return a.iVal; }) .toVector(); 


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

рдЬреНрд╡рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдСрдкрд░реЗрдЯрд░ ==, рдпрд╛ рд╕рдордХрдХреНрд╖, рдСрдкрд░реЗрдЯрд░ <рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╕рдорд╛рдирддрд╛ рдкрд░ рдЕрдиреБрдХреНрд░рдо рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рджреБрд╡рд┐рдзрд╛ рдереАред рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред рдХрдо рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╡рд┐рд▓рдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреА рджреВрд╕рд░реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП Linq рдореЗрдВ, рдпрд╣ рдСрдкрд░реЗрдЯрд░ == рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рддреБрд▓рдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЬрдЯрд┐рд▓рддрд╛ рдУ (рдПрди * рдПрдо) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП, рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рдПрдХ Linq рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рд╕рднреА рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рддрд░реАрдХреЛрдВ рдХреЛ рджреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЧреНрд░рд╛рдл рдХреЗ рдЖрдЧреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╡реЗ Linq <?> рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдБ рд▓реМрдЯрддреЗ рд╣реИрдВ:

 template <typename U> Linq<T> where(U f); 


рдФрд░ "рдЯрд░реНрдорд┐рдирд▓" рд╡рд╛рд▓реЗ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдл рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 size_t count(); std::vector<T> toVector(); 


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

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

 LinqOrd<T> orderBy(); LinqOrd<T> orderByDesc(); 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдСрд░реНрдбрд░рдмрд╛рдп рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, LinqOrd рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдСрд░реНрдбрд░ рдСрдкрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВред

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

 template<typename T> class Range { public: Range(){} virtual ~Range(){} virtual bool empty() = 0; virtual T& popFront() = 0; virtual T& front() = 0; virtual void rewind() = 0; virtual Range* clone() = 0; }; 


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

рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрдЪрд╛рд▓рди рд░реЗрдВрдЬ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХреЛрдб рджреВрдВрдЧрд╛ рдЬрд╣рд╛рдВ: рд╡реНрд╣реЗрдпрд░рд░реЗрдВрдЬ <рдЯреА, рдПрдл>ред рдЬрд╣рд╛рдВ рдЯреА рддрддреНрд╡ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдПрдл рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХрд╛ рд╡рд░реНрдЧ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, F рдХреЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ T рдпрд╛ T рдХреЗ рд╕рдиреНрджрд░реНрдн рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рдФрд░ рдпрджрд┐ рддрддреНрд╡ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИред

 template<typename T, typename F> class WhereRange : public Range<T> { public: WhereRange(Range<T> *src, F f) : src_(src) , f_(f) , frontReady(false) { } ~WhereRange() { delete src_; }; bool empty() override { if (!frontReady) seekFront(); return src_->empty(); } T& popFront() override { if (!frontReady) seekFront(); auto &result = src_->front(); frontReady = false; src_->popFront(); seekFront(); return result; } T& front() override { return src_->front(); } void rewind() override { frontReady = false; src_->rewind(); } Range<T>* clone() override { auto result = new WhereRange(CloneRange(src_), f_); return result; } private: Range<T> *src_; F f_; bool frontReady; void seekFront() { while(!src_->empty() && !f_(src_->front())) src_->popFront(); frontReady = true; } }; 


рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрд╛рдо рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдореЗрдВ рдЖрдк рдПрд▓рд┐рдореЗрдВрдЯ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд▓рд┐рдореЗрдВрдЯ рдЯрд╛рдЗрдк рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 TestClass1 data[10]; auto src = Linq::from(data); auto result = src .where([](decltype(src.const_reference()) a){return a.iVal >= 5; }) .orderBy([](decltype(src.const_reference()) a){return a.sVal; }) .toVector(); 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ TestClass1 рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рднреА рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░ рднреА рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВ:

 auto data1 = testData1(); auto data2 = testData2(); auto src1 = Linq::from(data1); auto src2 = Linq::from(data2); auto result = src1 .join( src2, [](decltype(src1.const_reference()) a){ return a.iVal; }, [](decltype(src2.const_reference()) b){ return b.iVal2; }, [] (decltype(src1.const_reference()) a, decltype(src2.const_reference()) b) { return std::make_pair(b.dVal, a.sVal); } ) .toVector(); } 


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

PS gcc 4.7 рдУрд╡рд░рд░рд╛рдЗрдб рдХреАрд╡рд░реНрдб рдХреЛ рдкрдЪрд╛ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП #define рдУрд╡рд░рд░рд╛рдЗрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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


All Articles