рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
std::multiset<int> set0, set1; for (auto it = set0.begin(); it != set0.end(); ++it) { // // // *it } for (auto it = set1.rbegin(); it != set1.rend(); ++it) { // // // *it }
рдЪрдХреНрд░реЛрдВ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рди рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рджреЛ рдорд▓реНрдЯреАрд╕реЗрдЯ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рд╕реАрдзреЗ рдХреНрд░рдо рдореЗрдВ рдкрд╣рд▓рд╛, рд╡рд┐рдкрд░реАрдд рдореЗрдВ рджреВрд╕рд░рд╛ред
рдХрд╛рд░реНрдп рдЗрди рджреЛ рдЪрдХреНрд░реЛрдВ рдХреЛ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИ:
size_t const N = 2; std::multiset<int> sets[N] = {}; for (size_t i = 0; i < N; ++i) { for (auto const& val: sets[i]) {
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕реЗрдЯ 1 рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реЗрдЯ рдХреНрд░рдо рдореЗрдВ [1] рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреНрд░рдо рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕реЗрдЯ [1] рд╕реЗрдЯ 1 рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд┐рдкрд░реАрдд рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВред рдПрд╕рдЯреАрдПрд▓ рд╕рд╣рдпреЛрдЧреА рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ, рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рддреБрд▓рдирд┐рддреНрд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди std :: рдХрдо рд╣реИред рддреЛ рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
std::multiset<int> sets[N] = {std::multiset<int, std::less>(), std::multiset<int, std::greater>()};
Std :: multiset <int, std :: less> рдФрд░ std :: multiset <int, std :: рдмрдбрд╝рд╛> рд╡рд░реНрдЧ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреВрд░реНрд╡рдЬ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рд╡реИрд╕реЗ, iterators std :: multiset :: const_iterator рдФрд░ std :: multiset :: const_reverse_iterator рднреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреВрд░реНрд╡рдЬ рдХреЗ рдмрд┐рдирд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдХрд╛рд░реНрдп рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдПрдХреАрдХрд░рдг рдХреЛ рдЙрдмрд╛рд▓рддрд╛ рд╣реИред
рдПрд╕рдЯреАрдПрд▓ рд╕рд╣рдпреЛрдЧреА рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ, рддреБрд▓рдирд┐рддреНрд░ рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛, рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рддреБрдЪреНрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ std :: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрдо, рддреБрд▓рдирд┐рддреНрд░ рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдХрдВрдЯреЗрдирд░ рдПрдХ рд╣реА рддреБрд▓рдирд╛ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡реЗ рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддреБрд▓рдирд┐рддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЙрд░реНрдЯ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рддреБрд▓рдирд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдЗрдЯрдо рд╕реЙрд░реНрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИред рддреЛ, рдПрдХ рддреБрд▓рдирд┐рддреНрд░ рд╡рд░реНрдЧ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
template <typename T> class Comparator { public: bool operator()(const T& l, const T& r) const { return ASC == order_ ? (l < r) : (l > r); } static Comparator const& Asc() { return asc_; } static Comparator const& Desc() { return desc_; } private: enum Order_ {ASC, DESC} const order_; Comparator(Order_ order) : order_(order) {}; static Comparator asc_; static Comparator desc_; }; template<typename T> Comparator<T> Comparator<T>::asc_(Comparator<T>::ASC); template<typename T> Comparator<T> Comparator<T>::desc_(Comparator<T>::DESC);
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреА рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХреЗрд╡рд▓ 2 рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди 2 рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддреБрд▓рдирд┐рддреНрд░ рд╡рд░реНрдЧ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрди рджреЛрдиреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рднреА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ (рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ)ред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ:
typedef std::multiset<int, Comparator<int> > Set; Set sets[N] = { Set(Comparator<int>::Asc()), Set(Comparator<int>::Desc()) };
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд╣рдпреЛрдЧреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╣реА рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рддреБрд▓рдирд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реВрдЪрдХ рдпрд╛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рд╕рдорд╛рдзрд╛рди рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрд░реВрдкреА рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рднреА рдЧрддрд┐рд╢реАрд▓ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЗ рд╕рдорд╛рди рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
template<typename T> bool compareLess(const T& l, const T& r) { return l < r; } template<typename T> bool compareGreater(const T& l, const T& r) { return l > r; }
рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░, рдЬреЛ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рддреБрд▓рдирд┐рддреНрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╛рдзрд╛рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рдгреА рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ:
typedef bool (*compareFn)(int const&, int const&); typedef std::multiset<int, compareFn> Set2; Set2 sets2[N] = { Set2(compareLess<int>), Set2(compareGreater<int>) };
UPD: рдПрд╕рдЯреАрдбреА
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :: рдлрд╝рдВрдХреНрд╢рди, 4 рдФрд░ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП:
рд╡рд┐рдХрд▓реНрдк 3: рд▓рд╛рдЗрдмрд╛рдбрд╛ рдХрд╛рд░реНрдп
рд╡рд┐рдХрд▓реНрдк 4: std :: std рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдХрдо :: рдлрд╝рдВрдХреНрд╢рди, рд░рд┐рд╡рд░реНрд╕ рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП, std рдХреЗ рдорд╛рдкрджрдВрдб :: рдХрдо std рдХреЗ рд╕рд╛рде рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ :: рдмрд╛рдБрдз
рд╡рд┐рдХрд▓реНрдк 5: рдПрд╕рдЯреАрдбреА :: рдХрдо рдФрд░ рдПрд╕рдЯреАрдбреА :: рдПрд╕рдЯреАрдбреА рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд┐рдкрдЯреЗ :: рдлрд╝рдВрдХреНрд╢рди
рд╡рд┐рдХрд▓реНрдк 6: рд╡рд┐рдХрд▓реНрдк 2 рдФрд░ 3 рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ: std :: function cast to a function pointer
рдореИрдВ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдорд▓реНрдЯреАрд╕реИрдЯ рдЙрдирдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рд╣реА рдХреНрд░рдо рдХреНрд░рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ):
#include <iostream> #include <set> #include <functional> using namespace std::placeholders; template <typename T> class Comparator { public: bool operator()(const T& l, const T& r) const { return ASC == order_ ? (l < r) : (l > r); } static Comparator const& Asc() { return asc_; } static Comparator const& Desc() { return desc_; } private: enum Order_ {ASC, DESC} const order_; Comparator(Order_ order) : order_(order) {}; static Comparator asc_; static Comparator desc_; }; template<typename T> Comparator<T> Comparator<T>::asc_(Comparator<T>::ASC); template<typename T> Comparator<T> Comparator<T>::desc_(Comparator<T>::DESC); template<typename T> bool compareLess(const T& l, const T& r) { return l < r; } template<typename T> bool compareGreater(const T& l, const T& r) { return l > r; } int main() { static size_t const N = 2; int unsorted[] = {4, 6, 3, 4, 7, 8, 1, 2}; //1 { typedef std::multiset<int, Comparator<int> > Set; Set sets[N] = { Set(Comparator<int>::Asc()), Set(Comparator<int>::Desc()) }; for (size_t i = 0; i < N; ++i) { sets[i].insert(std::begin(unsorted), std::end(unsorted)); } for (size_t i = 0; i < N; ++i) { for (auto const& it : sets[i]) { std::cout << it << " "; } std::cout << "\n"; } } //2 { typedef bool (*compareFn)(int const&, int const&); typedef std::multiset<int, compareFn> Set2; Set2 sets2[N] = { Set2(compareLess<int>), Set2(compareGreater<int>) }; for (size_t i = 0; i < N; ++i) { sets2[i].insert(std::begin(unsorted), std::end(unsorted)); } for (size_t i = 0; i < N; ++i) { for (auto const& it : sets2[i]) { std::cout << it << " "; } std::cout << "\n"; } } //3 { typedef std::multiset<int, std::function<bool(int,int)>> Set3; Set3 sets3[N] = {Set3([](int a, int b){ return a < b; }), Set3([](int a, int b){ return a > b; })}; for (size_t i = 0; i < N; ++i) { sets3[i].insert(std::begin(unsorted), std::end(unsorted)); } for (size_t i = 0; i < N; ++i) { for (auto const& it : sets3[i]) { std::cout << it << " "; } std::cout << "\n"; } } //4 { typedef std::multiset<int, std::function<bool(int,int)>> Set4; Set4 sets4[N] = {Set4(std::less<int>()), Set4(std::bind(std::less<int>(), _2, _1))}; for (size_t i = 0; i < N; ++i) { sets4[i].insert(std::begin(unsorted), std::end(unsorted)); } for (size_t i = 0; i < N; ++i) { for (auto const& it : sets4[i]) { std::cout << it << " "; } std::cout << "\n"; } } //5 { typedef std::multiset<int, std::function<bool(int,int)>> Set5; Set5 sets5[N] = {Set5(std::less<int>()), Set5(std::greater<int>())}; for (size_t i = 0; i < N; ++i) { sets5[i].insert(std::begin(unsorted), std::end(unsorted)); } for (size_t i = 0; i < N; ++i) { for (auto const& it : sets5[i]) { std::cout << it << " "; } std::cout << "\n"; } } //6: 2 3 { typedef bool (*compareFn)(int const&, int const&); typedef std::multiset<int, compareFn> Set6; Set6 sets6[N] = {Set6([](int const& a, int const& b){ return a < b; }), Set6([](int const& a, int const& b){ return a > b; })}; for (size_t i = 0; i < N; ++i) { sets6[i].insert(std::begin(unsorted), std::end(unsorted)); } for (size_t i = 0; i < N; ++i) { for (auto const& it : sets6[i]) { std::cout << it << " "; } std::cout << "\n"; } } return 0; }