auto greater = [](unsigned u1, unsigned u2) {return u1 > u2;};
multiset<Class>::iterator it = multiset.begin();
for(int i = 0; i < 3; i++){
cout << *it++ << endl;
}
Нужно вывести первые 3 элемента, но согласно моей лямбда-сортировке
Немного больше получилось т.к. оформил в виде шаблона в стиле stl, который возвращает N максимальных элементов для заданного диапазона итераторов с заданным компаратором:
#include <iostream>
#include <vector>
#include <set>
#include <assert.h>
template<class InputIt, class LessPredicate>
std::multiset < typename InputIt::value_type, LessPredicate >
max_elements (InputIt begin, InputIt end, size_t N, LessPredicate pred) {
assert (N>0);
std::multiset < typename InputIt::value_type, LessPredicate> rv(pred);
auto it = begin;
for (size_t i = 0; i<N && it != end; i++, it++) {
rv.insert (*it);
}
for (; it != end; it++) {
if (pred (*rv.begin(), *it)) {
rv.erase (rv.begin());
rv.insert (*it);
}
}
return rv;
}
int main () {
auto less = [](int u1, int u2)-> bool {return u1 < u2;};
std::vector<int> vec = {1,0,8,12,2,3,5,5,8};
int N = 3;
std::cout << N << " maximum elements are: ";
for(int el : max_elements (vec.begin(), vec.end(), N, less) ){
std::cout << el << ' ';
}
std::cout << std::endl;
return 0;
}
Я не большой мастак писать шаблоны и, вероятно код отлажен недостаточно усердно, так что замечания приветствуются;
Также вероятно, если заменить дерево на кучу, то выйдет несколько оптимальней.
Может неправильно сформулировал, но вот правильный ответ, всем спасибо)
auto greater = [](unsigned u1, unsigned u2) {return u1 > u2;};
multiset<Class,decltype(greater)> myMultiset(greater);
int i=1;
for(const auto& it:myMultiset){
cout << it << endl;
if(i > 3) break;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости