не буквальный тип «сравнить» в константном выражении - PullRequest
0 голосов
/ 18 апреля 2019

создаю свой собственный класс сравнения для priority_queue, однако я не могу понять, почему сообщение продолжает показывать не-литеральный тип

И если вы хотите увидеть, что делает мой код, вот описание:

Слияние K отсортированных списков интервалов в один отсортированный список интервалов. Вам также необходимо объединить перекрывающиеся интервалы.

class compare {
private:
    vector<vector<Interval>> tmp;
public:
    compare (vector<vector<Interval>> &intervals) {
        tmp = intervals;
    }
    bool operator() (const pair<int, int> &a, const pair<int, int> &b) {
        return tmp[a.first][a.second].start > tmp[b.first][b.second].start;
    }
};


class Solution {
public:
    vector<Interval> mergeKSortedIntervalLists(vector<vector<Interval>> &intervals) {
        priority_queue<pair<int, int>, vector<pair<int, int>>, compare(intervals)> pq;

        for (int i = 0; i < intervals.size(); i++) {
            if (!intervals[i].empty()) {
                pq.push(make_pair<i, 0>);
            }
        }
        vector<Interval> res;
        while(!pq.empty()) {
            pair<int, int> node = pq.top();
            pq.pop();
            res.push_back(intervals[node.first][node.second]);
            node.second++;
            if(node.second < intervals[node.first].size()) {
                pq.push(make_pair(node.first, node.second));
            }
        }
        return mergeInterval(res);
    }

private:
    vector<Interval> mergeInterval (vector<Interval> &res) {
        if(res.empty() || res.size() == 1) return res;
        vector<Interval> ans;

        int start = res[0].start;
        int end = res[0].end;
        for (auto interval : res) {
            if(interval.start <= end) {
                end = max(interval.end, end);
            }else {
                ans.push_back({start, end});
                start = interval.start;
                end = interval.end;
            }
        }
        ans.push_back({start, end});
        return ans;
    }

};

сообщение об ошибке: временный не-литерального типа 'сравнить' в константном выражении priority_queue, vector>, сравнить (интервалы)> pq;

1 Ответ

2 голосов
/ 18 апреля 2019

Я вижу две проблемы с кодом:

  1. priority_queue<pair<int, int>, vector<pair<int, int>>, compare(intervals)> pq; должно быть priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq{compare(intervals)};

  2. make_pair<i, 0> должно быть make_pair(i, 0)

По крайней мере, тогда компилируется .

...