2017-10-03 5 views
0

Je suis un débutant en C++. J'essaie de créer un maxheap et un minheap en utilisant std :: priority_queue. Créer juste un maxheap fonctionne bien mais pas les deux. Je n'arrive pas à comprendre l'erreur. Je reçois l'erreur suivante: n'a pas pu convertir 'minHeap' de 'std :: priority_queue, comparer>' à 'std :: priority_queue' J'ai essayé de chercher sur internet mais en vain. Voici le code.erreur: impossible de convertir 'minHeap' de 'std :: priority_queue, std :: greater>' en 'std :: priority_queue

void addNum(int num, priority_queue<int> maxHeap, priority_queue<int> minHeap) { 
    if (minHeap.size() == 0 || num > minHeap.top()) 
     minHeap.push(num); 
    else if (num < minHeap.top()) 
     maxHeap.push(num); 
} 

void createHeaps(vector<int> a) { 
    priority_queue<int> maxHeap; 
    priority_queue<int, vector<int>, greater<int> > minHeap; 
    for (int i = 0; i < a.size(); ++i) { 
     int num = a[i]; 
     addNum(num, maxHeap, minHeap); 
    } 
} 
+0

un 'priority , plus >' est pas un '' priority Kevin

+0

'priority , plus >' est pas le même type que '' ... priority_queue – Jarod42

Répondre

1

Vous devez utiliser le type correct pour votre méthode aussi:

void addNum(int num, 
      priority_queue<int, >& maxHeap, 
      priority_queue<int, std::vector<int>, std::greater<int>>& minHeap) { 
    if (minHeap.size() == 0 || num > minHeap.top()) 
     minHeap.push(num); 
    else if (num < minHeap.top()) 
     maxHeap.push(num); 
} 

Ou vous pourriez TEMPLATE votre méthode pour être plus générique

template <typename ... Ts1, typename ... Ts2> 
void addNum(int num, 
      priority_queue<int, Ts1...>& maxHeap, 
      priority_queue<int, Ts2...>& minHeap) { 
    if (minHeap.size() == 0 || num > minHeap.top()) 
     minHeap.push(num); 
    else if (num < minHeap.top()) 
     maxHeap.push(num); 
} 

ou même, tout simplement:

template <typename PriorityQueue1, typename PriorityQueue2> 
void addNum(int num, 
      PriorityQueue1& maxHeap, 
      PriorityQueue2& minHeap) { 
    if (minHeap.size() == 0 || num > minHeap.top()) 
     minHeap.push(num); 
    else if (num < minHeap.top()) 
     maxHeap.push(num); 
} 
2

Vous essayez pour passer une variable avec le type priority_queue<int, vector<int>, greater<int> >, mais votre fonction attend le type priority_queue<int>.

Corriger le prototype de la fonction:

void addNum(int num, priority_queue<int>& maxHeap, priority_queue<int, vector<int>, greater<int> >& minHeap) { 
    if (minHeap.size() == 0 || num > minHeap.top()) 
     minHeap.push(num); 
    else if (num < minHeap.top()) 
     maxHeap.push(num); 
} 

Vous devez utiliser des références. C'est parce que vous devez modifier les collections originales.