Несколько компараторов без оператора <(C ++) - PullRequest
0 голосов
/ 07 мая 2020

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

В bit.h У меня есть:

#include<vector>
#include<queue>

class bit {
  static std::priority_queue<bit, std::deque<bit>> bigBitVector;
  mutable long long startTime;
  mutable long long endTime;
  // other methods, constructor, etc.
  static bool startTimeComp(const bit &a, const bit &c) {
    return a.startTime > c.startTime;
  }
  static bool endTimeComp(const bit &a, const bit &c) {
    return a.endTime > c.endTime;
  }
}

В другом файле я пробую для инициализации одной очереди приоритетов bit объектов как:

std::priority_queue<bit, std::deque<bit>, decltype(&bit::startTimeComp)> bigBitVector(bit::startTimeComp);

и другой как

std::priority_queue<bit, std::deque<bit>, decltype(&bit::endTimeComp)> bitQueue(bit::endTimeComp);

, но я получаю сообщение об ошибке:

/ usr /include/c++/7/bits/stl_function.h:386:20: ошибка: нет соответствия для 'operator <' (типы операндов - 'const bit' и 'const bit') </p>

I проверил эту ошибку, и я нашел других с проблемой, где они хотели определить что-то вроде

bool operator<(const bit &a) const {...}

, и ошибка возникает из-за отсутствия const. Но если я добавлю const к своим компараторам, компилятор пожалуется, потому что функция не может быть одновременно static и const; если я удаляю static, он жалуется, потому что к нему нельзя получить доступ без указанного объекта c.

Похоже, проблема в том, что приоритетная очередь ищет определенный оператор c <, а не использует компаратор, который я предоставил. Я не хочу предоставлять оператор <, потому что тогда у меня не может быть двух разных очередей приоритетов, сортирующих одни и те же данные двумя разными способами.

Есть ли способ определить несколько компараторов и избежать этого ошибка?

1 Ответ

0 голосов
/ 07 мая 2020

Вы забыли компаратор на элементе stati c

static std::priority_queue<bit, std::deque<bit>> bigBitVector;

По умолчанию он будет использовать std::less в качестве компаратора, который, в свою очередь, сравнивает элементы с operator<, который bit не перегружает . Либо перегрузка operator< для bit, либо указание другого компаратора для bigBitVector должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...