Приоритет empque создает ошибку сегментации
Следующий код дает ошибку сегментации, может кто-то просветить меня? Все, чего я хотел добиться - это отсортировать очередь с приоритетами по возрастанию tv.t или по убыванию tv.m.
struct tv {
int m;
int c;
int t;
tv(int mm, int cc, int tt): m(mm), c(cc), t(tt) {}
};
bool comp(struct tv & t1 , struct tv & t2) {
if (t1.t == t2.t) {
return t1.m < t2.m;
}
return t1.t > t2.t;
}
int main(int argc, char** argv) {
priority_queue<struct tv, vector<struct tv>, decltype(&comp)> q;
q.emplace(0, 0, 0);
q.emplace(1, 0, 0);
q.emplace(1, 1, 1);
q.emplace(1, 2, 0);
return 0;
}
1 ответ
Решение
Вы задали приоритетной очереди тип компаратора в списке аргументов шаблона, но не указали фактический компаратор в конструкторе.
priority_queue<tv, vector<tv>, decltype(&comp)> q(comp);
Как он у вас есть, он вызывает нулевой указатель на функцию. Это очень удобно при использовании функциональных объектов вместо указателей на функции. Они могут быть построены по умолчанию и делать правильные вещи.
struct comp_t {
bool operator()(const tv & t1 , const tv & t2) const {
if (t1.t == t2.t) {
return t1.m < t2.m;
}
return t1.t > t2.t;
}
};
priority_queue<tv, vector<tv>, comp_t> q;