0

以下代码给出了分段错误,有人可以启发我吗?我想要实现的只是让优先级队列按 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;
}
4

1 回答 1

2

您在模板参数列表中为优先级队列提供了一个比较器类型,但在构造函数中没有给它一个实际的比较器。

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;
于 2016-03-01T04:28:05.617 回答