Пользовательский компаратор (упорядочение) как параметр упорядочения (мульти) карт?

Мой вопрос во многом похож на этот: Передайте пользовательский компаратор через функцию, но я попробовал предложенное там решение , так и не смог заставить его работать.

Короче говоря, у меня есть метод, который хранит несколько отсортированных структур и выполняет несколько сравнений, всегда с элементами типа int, все используют один и тот же порядок. Порядок определяется при вызове метода.

Предполагаемый вызов будет выглядеть примерно так: myFunction(std::greater<int>());

Сначала я попытался объявить функцию как: void myFunction(binary_operator<int, int, bool> order);, но, согласно этому объяснению, binary_function не подходит для работы в качестве базового класса. в вызовах функций.

Наконец, я попробовал предложение из этого ответа (и многих других сайтов), которое предложило < strong>использование шаблонов. Но я все еще не могу скомпилировать свой код.

Минимальный нерабочий пример:

template <typename Comparator> 
void myFunction(Comparator order){

  if (order(1,2)){
      // some stuff
      // COMPILES OK
  }

  std::vector <int> vecToSort;
  // ... initialize
  std::sort(vecToSort.begin(), vecToSort.end(), order); // works
  // COMPILES OK

  std::multimap <int, int, order > boundary;
  // STARTS KICKING, SCREAMING AND SHOUTHING
}

и ошибка компиляции, которую я получаю:

ошибка: несоответствие типа/значения в аргументе 3 в списке параметров шаблона для «template class std::multimap» ошибка: ожидался тип, получен «порядок»

Я подумал, что один и тот же трюк должен работать для обоих. Это не. (изменить: теперь я вижу проблему type/object)

Может кто-нибудь объяснить, что здесь происходит и как заставить multimap использовать порядок, переданный в качестве аргумента функции ?

PS: я не использую boost для этого проекта.


person penelope    schedule 02.05.2013    source источник
comment
ошибка очень ясна, порядок - это объект, а не тип, поэтому его нельзя передать в параметр шаблона.   -  person yngccc    schedule 02.05.2013
comment
std::multimap требуется тип в качестве параметра шаблона, а вы используете объект.   -  person juanchopanza    schedule 02.05.2013
comment
хорошо, я вижу проблему с типом/объектом. Но это просто ответ почему я получаю сообщение об ошибке, а не как использовать желаемый порядок (переданный как параметр функции) для упорядочения моих структур, включая multimap.   -  person penelope    schedule 02.05.2013


Ответы (2)


Он должен быть объявлен следующим образом:

std::multimap <int, int, Comparator> boundary(order);
                         ^^^^^^^^^^

Как говорится в комментариях, вам нужно указать type, а не object. Эти документы для Construct multimap содержат несколько примеров.

person Shafik Yaghmour    schedule 02.05.2013
comment
хорошо, я вижу проблему с типом/объектом. Но, например, в каком точном порядке будут элементы в multimap? Как добиться того, чтобы они были упорядочены тем, что передается в качестве параметра функции при вызове функции? - person penelope; 02.05.2013
comment
@penelope Извините за опечатку, я только что исправил ее. - person Shafik Yaghmour; 02.05.2013
comment
@penelope Просто создав экземпляр, как показано выше, передав order в качестве параметра конструктора. См. здесь. - person juanchopanza; 02.05.2013

Используйте Comparator и order в этой форме:

std::multimap <int, int, Comparator> boundary (order);

Сначала передайте тип сравнения внутри <>, а затем передайте объект сравнения в конструкторе.

person masoud    schedule 02.05.2013