рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ
рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ рдмреВрд▓рд┐рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реНрд░реЛрдд рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЯреНрд░рд┐рдХреНрд╕ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА "рдЖрд▓рд╕реА" рдФрд░ рд╡рд┐рд▓реБрдкреНрдд рд╣реЛ рдЧрдИред

рдЗрд╕рдореЗрдВ рдЧрд▓рдд рдХреНрдпрд╛ рд╣реИ?
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рджреЗрдЦреЗрдВ, рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди STL рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрд╣ рдПрдХ рдорд╛рдирдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдВрдЯреЗрдирд░, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ - рдПрдХ
рдкреБрдирд░рд╛рд╡реГрддреНрдд ред рдХрдВрдЯреЗрдирд░реЛрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмреАрдЪ рдПрдХ рдкрд░рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Iterators рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрд╛рдХрд┐ рдХрд┐рд╕реА рднреА рдХрдВрдЯреЗрдирд░ (рдХрд┐рд╕реА рднреА, рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА) рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдХрдВрдЯреЗрдирд░ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдЗрдХрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ - рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╣реИ, рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ:
int sum = 0; for (std::vector<int>::iterator it = candles.begin(); it != candles.end(); it++) sum += it->ClosePrice;
рдПрд╕рдЯреАрдПрд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЦрд╛рдореА рд╣реИ рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕ рд╢реВрдиреНрдп рдХреА рдХрдореА рд╣реИред
int sum = 0; Iterator it = al.iterator(); while (it.hasNext()) { it = it.next(); sum += it.ClosePrice; }
рд╣рд╛рдВ, рдпреЗ
.begin()
рдФрд░
.end()
рдПрдХ рд╣реА рдЗрдХрд╛рдИ рдХреЗ рджреЛ рднрд╛рдЧ рд╣реИрдВред рдпрджрд┐ рдЗрди рджреЛ рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рдЗрдХрд╛рдИ рдореЗрдВ рд▓реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╕рдВрдпреБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ ... рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ - (рд╡рд┐рдЪрд╛рд░
"рдПрдЯрд░реЗрдЯрд░реНрд╕ рдорд╕реНрдЯ рдЧреЛ" рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛):
template<typename TIter> class IterRange { public: typedef typename std::iterator_traits<TIter>::value_type value_type; IterRange(TIter b, TIter e) : b(b), e(e) { } bool empty() { return (b == e); } value_type popFront() { assert(!empty()); return *(b++); } value_type popBack() { assert(!empty()); return *(--e); } value_type front() { assert(!empty()); return *b; } value_type back() { assert(!empty()); TIter tmp = e; return *(--tmp); } private: TIter b; TIter e; };
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ, рд╣рдо рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдзрд┐рдХ рддрддреНрд╡ рд╣реИрдВ, рдПрдХ рддрддреНрд╡ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
back()
рдФрд░
popBack()
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рднреА
popBack()
рдирд╣реАрдВ
popBack()
ред
рдареАрдХ рд╣реИ, рдлрд┐рд░ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрдХреНрд╖рд╛рдПрдВ рдХреИрд╕реЗ рджрд┐рдЦрддреА рд╣реИрдВ - рдпреЗ рдЗрд╕ рддрд░рд╣ рдХреА рд░реЗрдВрдЬ рдкрд░ рд░реИрдкрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдБрд░рдВрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
template<typename R, typename F> class WhereRange { public: typedef typename R::value_type value_type; WhereRange(R r, F f) : r(r), f(f) , frontReady(false) , backReady(false) { } bool empty() { if (!frontReady) seekFront(); return r.empty(); } value_type popFront() { if (!frontReady) seekFront(); auto tmp = *this; r.popFront(); frontReady = false; return tmp.front(); } value_type popBack() {
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдФрд░ рд░реЗрдВрдЬ рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЙрд╕реЗ рдПрд▓реАрдореЗрдВрдЯ рд▓реЗрдиреЗ рдкрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдкреНрд░реЗрдбрд┐рдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрд▓рд┐рдореЗрдВрдЯ рд╕реЗрд▓реЗрдХреНрдЯ рд╣реБрдЖ рд╣реИ рдпрд╛ рдирд╣реАрдВред 2 рдЪрд░ рд╣реИрдВ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдорд╛рди "рд╢реБрд░реБрдЖрдд рд╕реЗ" рдФрд░ "рдПрдХ рд╕реАрдорд╛ рдХреЗ рдЕрдВрдд рд╕реЗ" рд╣реИред рд╕реАрдХрдлреНрд░рдВрдЯ () рдФрд░ рд╕реАрдХрдмреИрдХ () рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реАрдзреЗ рдЕрдЧрд▓реЗ рдореЛрд░реНрдЪреЗ рдФрд░ рдЕрдЧрд▓реЗ рдмреИрдХ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдиреНрдп рд╕рднреА рд░реЗрдВрдЬ рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВред рдЕрдЧрд▓реА рд╕рдорд╕реНрдпрд╛ рдбреЙрдЯ рдиреЛрдЯреЗрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдереА ...
рдореБрдЭреЗ рдПрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдиреЛрдЯреЗрд╢рди рдЪрд╛рд╣рд┐рдП
рдПрдХ рдУрд░, рдореИрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рддрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ .NET LINQ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди C ++ рдореЗрдВ C #: рдХреА рддрд░рд╣
рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред
int max = arr.Where(...).OrderBy(...).Select(...).Max();
рджреВрд╕рд░реА рддрд░рдл, рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ ... рдФрд░ рдпрд╣рд╛рдБ рдореБрдЭреЗ
рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛)) рд╕рднреА рд╢реНрд░реЗрдгреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЗрдирдХ рд╡рд░реНрдЧ рдХреЛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рдЖрдк рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рддреЛ рд▓рд╛рдЗрдирдХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╡рд░реНрдЧ рдХреЛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд▓рд╛рдЗрдирдХ рд╡рд░реНрдЧ рд╕рднреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░рд╣реЗрдЧрд╛ред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рд░реЗрдВрдЬ рдиреЗ рдорд┐рдХреНрд╕рд┐рдВрдЧ рд░реИрдкрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд┐рдпрд╛:
template<template<typename> class TLinq, typename R> class WhereRange_mixin { public: template<typename F> TLinq<WhereRange<R,F> > where(F f) const { return boolinq::where(((TLinq<R>*)this)->r,f); } };
рдлрд┐рд░, рдореБрдЭреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдорд┐рдХреНрд╕рд┐рди рд╕реЗ рд▓рд╛рдЗрдирдХ рд╡рд░реНрдЧ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛:
template<typename R> class Linq : public SkipRange_mixin<Linq,R> , public TakeRange_mixin<Linq,R> , public WhereRange_mixin<Linq,R> , public SelectRange_mixin<Linq,R> , public ReverseRange_mixin<Linq,R> , public OrderByRange_mixin<Linq,R>
рддрддреНрд╡ рддрддреНрд╡ рдЙрд▓рдЯрд╛
рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбрдмрд▓ рд░рд┐рд╡рд░реНрд╕ рдЕрдиреБрдХреНрд░рдо рдирд╛рдЦреВрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдФрд░ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рд╣рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд░реНрдЧ рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
template<typename R> class ReverseRange { public: typedef typename R::value_type value_type; ReverseRange(R r) : r(r) { } bool empty() { return r.empty(); } value_type popFront() { return r.popBack(); } value_type popBack() { return r.popFront(); } value_type front() { return r.back(); } value_type back() { return r.front(); } template<typename R2> friend R2 reverse(ReverseRange<R2> r);
рдЗрд╕ рдХреЛрдб рдореЗрдВ рд╕рдмрдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдкрдХреЛ рдЙрдореНрдореАрдж рдереА: рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЙрд▓рдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдХреВрд▓ рдХрд╛рд░реНрдп рдЦреЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рд╡рд╣ рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ - рдПрдХ рд▓рд┐рдкрдЯреЗ рд░реЗрдВрдЬ, рдпрд╣рд╛рдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╣реИ:
template<typename R> ReverseRange<R> reverse(R r) { return r; }
рд╣рд╛рдБ! рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд╣реАрдВ рд╣реИ - рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рд╣реИрдВред рдкрд╣рд▓рд╛ рдХрд╛рдо рдпрд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рд╣рдорд╛рд░реЗ ReaverseRange рдХреЗ рд╕рд╛рде рд░реЗрдВрдЬ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ (рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрдорд╛рддрд╛ рдХреЙрд▓ рд╣реИ)ред рджреВрд╕рд░рд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, ReverseRange рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕реНрддрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдкрд░ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдирд░рдХ рддрдм рд╢реБрд░реВ рд╣реБрдЖ рдЬрдм рдореИрдВрдиреЗ рдорд┐рдХреНрд╕рд┐рди рдореЗрдВ рдЗрд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
template<template<typename> class TLinq, typename R> class ReverseRange_mixin { public: TLinq<ReverseRange<R> > reverse() const { return boolinq::reverse(((TLinq<R>*)this)->r); } };
рдлрд┐рд░ рд╕реЗ, рдкрд╣рд▓рд╛ рдорд┐рдХреНрд╕рд┐рди рдЕрд╕рд╛рдорд╛рдиреНрдп рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рджреВрд╕рд░рд╛
Linq<ReverseRange<XxxRange<...>>>
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
Linq<XxxRange<...>>
ред рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдорд╕реНрддрд┐рд╖реНрдХ рдЯреВрдЯ рдЧрдпрд╛ред
рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛, рдЙрд╕реЗ рдЕрдкрдирд╛ рдЬрд╛рджреВ рд░реЗрдВрдЬ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рджреЗрдВ, рдлрд┐рд░ рдЕрдиреНрдп рдорд┐рдХреНрд╕рд┐рди рдХреА рдЫрд╡рд┐ рдФрд░ рд╕рдорд╛рдирддрд╛ рдореЗрдВ рдПрдХ рдорд┐рдХреНрд╕рд┐рди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВред рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ CustomLinq рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ Linq рд╕реЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рдорд┐рдХреНрд╕рдХ рд╕рдм рдХреБрдЫ CustomLinq рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ Linq рдореЗрдВ рд▓рдкреЗрдЯреЗрдВрдЧреЗ):
boolinq::from<CustomLinq>(arr)
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:
boolinq::from(arr)
рдЦреИрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рд╕рдм рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбреЙрдЯ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
using namespace boolinq; int sum = sum(select(where(from(arr), [](...){...}), [](...){...}));
рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг
рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд░реВрдВрдЧрд╛: рд╣рдо рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХреЗ рд╡рд┐рдЪрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рднреА рд╡рд┐рд╖рдо рддрддреНрд╡реЛрдВ рдХрд╛ рдФрд╕рдд рдореВрд▓реНрдп рдкрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдФрд╕рдд рд╕реЗ рд╡рд┐рд╖рдо рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред
1. рд╣рдо 100 рдорд┐рд▓рд┐рдпрди рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрддреНрд╡ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
srand(0xDEADBEEF); std::vector<int> vec(100000000, 0); for (unsigned i = 0; i < vec.size(); i++) vec[i] = rand();
2. рд╣рдо C ++ рдореЗрдВ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
3. рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдмреВрд▓рд┐рдирдХ рдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ
рдпрд╣ рдордд рджреЗрдЦреЛ рдХрд┐ C ++ рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рдмрд┐рдЫрд╛рдиреЗ рдирд╣реАрдВ рджрд┐рдпрд╛ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИред рдЕрдм MS Visual C ++ 2010 рдореЗрдВ
рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдореЗрд░реА рдорд╢реАрди рдкрд░ рдЪрд▓рд╛рдПрдБ ...
C ++ рдХреЛрдб | 1207 рдорд┐ |
рд╕реА ++ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ | 1224 рдорд┐ |
рдмреВрд▓рд┐рдирдХ рдХреЛрдб | 1564 рдорд┐ |
рдмреЗрд╢рдХ, рдмреВрд▓рд┐рдирдХ рдереЛрдбрд╝рд╛ рдЦреЛ рджреЗрддрд╛ рд╣реИ (рдПрдХ рддрд┐рд╣рд╛рдИ рд╕реЗ) - рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рд╕рднреА рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, .NET LINQ рдЕрдкрдиреЗ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ, рдмрд╣реБрдд рдордЬрдмреВрдд рдЪрдХреНрд░реЛрдВ рдореЗрдВ рдЦреЛ рджреЗрддрд╛ рд╣реИред
рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдПрд╕рдЯреАрдПрд▓ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП
.begin()
рдФрд░
.end()
рддрд░реАрдХреЗ рдХреЛ Linq рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред