2015-12-07 18 views
10

Per lo std :: priority_queue, ho assunto che il primo parametro del modello specificasse il tipo e il secondo fosse un contenitore di quel tipo. Esempio:Qual è l'uso del primo parametro del modello in priority_queue

priority_queue<int, vector<int>> someQueue; 

Tuttavia, il seguente codice compila e sembra che vada tutto bene:

class SomeClass 
{ 
}; 

int main() 
{ 
    priority_queue <SomeClass, vector<int>> pq; 
    int x = 9; 
    pq.push(x); 
    int t = pq.top(); 
    cout << t << endl; 
    pq.pop(); 
    return 0; 
} 

è il codice di cui sopra non validi (cioè dando UB)?

Se è valido, qual è il primo parametro di modello (ad esempio someClass) utilizzato in priority_queue.

+2

Bella scoperta. Ti permette di scrivere 'priority_queue ', suppongo. Non è usato da nessun'altra parte e non vedo alcun requisito nello standard. –

+0

Se vedi, ad es. [questo riferimento a 'std :: priority_queue'] (http://en.cppreference.com/w/cpp/container/priority_queue) vedrai che i tipi usati per i dati memorizzati effettivamente usano i tipi dal contenitore, non il fornito il primo argomento del modello. Se dovrebbe essere così e quello che dice la specifica non lo so. –

+0

Il parametro firsrt è il tipo di elemento nel secondo parametro. Quindi penso che 'priority_queue > pq;' sia sbagliato. per favore riferisciti a: http: //www.cplusplus.com/reference/queue/priority_queue/ – BlackMamba

risposta

3

Appena votato nel documento di lavoro in Jacksonville, via LWG issue 2566:

parametro Il primo modello T degli adattatori serbatoio deve indicare lo stesso tipo Container::value_type.

La scrittura di std::priority_queue<SomeClass, std::vector<int>> corrisponde a un comportamento non definito.

+0

Grazie per l'aggiornamento :) – 4386427

3

Nella specifica C++ 11 la sezione su std::priority_queue è §23.6.4. In esso il primo argomento del template è semplicemente il tipo predefinito usato per il contenitore e nient'altro.

Il tipo di valore effettivo viene prelevato dal contenitore.

La classe è dichiarata come

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

[Tratto da this reference]

Tale dichiarazione mostrano come, quando e dove il primo argomento modello viene utilizzato.

+1

Quindi il primo parametro è usato solo quando non specifichi un contenitore da solo - è così? – 4386427

+0

@StillLearning Sì, è corretto. –

+5

Per me, questo viola il principio del minimo stupore. – juanchopanza

Problemi correlati