С++ Мультисет Итератор

610
01 июля 2018, 07:50
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 элемента, но согласно моей лямбда-сортировке

Answer 1

Немного больше получилось т.к. оформил в виде шаблона в стиле 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;
}

Я не большой мастак писать шаблоны и, вероятно код отлажен недостаточно усердно, так что замечания приветствуются;

Также вероятно, если заменить дерево на кучу, то выйдет несколько оптимальней.

Answer 2

Может неправильно сформулировал, но вот правильный ответ, всем спасибо)

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;
}
READ ALSO
Перевыделение памяти с++, такое возможно?

Перевыделение памяти с++, такое возможно?

Недавно задали лабораторную домой по с++Перерыл почти весь интернет но ответ на один вопрос так и не нашёл

231
Не работает border-radius

Не работает border-radius

Проблема заключается в том, что после добавления градиента для блокаlogo перестал работать border-radius

263
Как сделать такую шапку?

Как сделать такую шапку?

Как сделать такую шапку? Использовать еще сетку (в моём примере Zurb Foudation) как на картинке

247