2017-11-08 15 views
0

私はこのleetcode questionを見て、ベクトル(O(nk)の代わりにO(nlogk))の代わりに優先度のキューでそれを解決したいと考えました。 priority_queueを、指定されたベクターで基になるコンテナとして初期化するにはどうすればよいですか?これは私が試みたものですが、コンパイルされないため、docsを誤解しました。priority_queueをベクトルから移動初期化しますか?

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

通常、コンパイルされないコードがある場合は、コンパイルエラーを投稿に追加することをお勧めします。異なるコンパイラ(gccとclangなど)を試して両方のエラーをポストすると、ボーナスポイントになります。 –

答えて

1

あなたは

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

を意味しましたか?

デフォルトで比較子がstd::less<typename Container::value_type>である(あなたが明示的にテンプレート引数でcmpを記述する必要が)と引数はcmpのインスタンス(ないクラスである必要があるため、実際のクラスはファーストクラスの市民ではありませんので、あなたのコードが失敗しましたC++では引数として渡すことはできません)。

関連する問題