2017-11-08 3 views
0

Ich sah dies leetcode question und wollte es mit einer Prioritätswarteschlange anstelle eines Vektors (also O (nlogk) anstelle von O (nk)) lösen. Wie verschiebe ich die priority_queue mit dem angegebenen Vektor als zugrunde liegenden Container? Dies ist, was ich versucht habe, aber ich habe eindeutig die docs missverstanden, weil es nicht kompilieren wird.Move-initialisiert eine priority_queue von einem Vektor?

struct ListNode { 
    int val; 
    ListNode *next; 
    ListNode(int x) : val(x), next(NULL) {} 
}; 

class cmp{ 
    public: 
    bool operator()(const ListNode *a,const ListNode *b) const { 
     if(b==nullptr) return false; 
     return a==nullptr || a->val>b->val; 
    } 
}; 
class Solution { 
    ListNode* helper(auto& lists) { 
     ListNode *ans=lists.top();lists.pop(); 
     if(ans==nullptr) return nullptr; 
     lists.push(ans->next); 
     ans->next=helper(lists); 
     return ans; 
    } 
public: 
    ListNode* mergeKLists(vector<ListNode*>& lists) { 
     if(lists.empty()) return nullptr; 
     priority_queue<ListNode*,vector<ListNode*>> pq(cmp,std::move(lists)); //compiler says error: 'std::move' is not a type 
     return helper(pq); 
    } 
}; 
+1

Wenn Sie Code haben, der nicht kompiliert wird, empfiehlt es sich normalerweise, den Kompilierungsfehler dem Post hinzuzufügen. Bonuspunkte, wenn Sie mit verschiedenen Compilern (zB gcc und clang) versuchen und beide Fehler posten. –

Antwort

1

Meinten Sie

priority_queue<ListNode*, vector<ListNode*>, cmp> pq{ cmp{}, std::move(lists) }; 

?

Ihr Code nicht standardmäßig, da der Vergleich std::less<typename Container::value_type> ist (so müssen Sie explizit cmp in Vorlage args schreiben) und weil das Argument eine Instanz von cmp (nicht die Klasse zu sein hat, eigentlich Klassen sind nicht Bürger erster Klasse in C++ können Sie sie nicht als Argumente übergeben).

Verwandte Themen