2013-04-08 12 views
7

Ho letto un'implementazione di una coda da alcuni libri dell'algoritmo, c'è uno snippet che è nuovo/interessante per me che non ho capito. Penso che sia qualcosa di nuovo come l'elenco di inizializzazione per il vettore in C++ 11, ma non sono così sicuro a causa del contesto del codice. Qualcuno può far luce o fornire qualche riferimento?Qual è il parametro parentesi graffa nel costruttore di C++ 11

template <typename T> 
class Queue { 
    private: 
     size_t head, tail, count; 
     vector<T> data; 
    public: 
     Queue(const size_t &cap=8) : head(0),tail(0),count(0),data({cap}) {} 
     //... more interfaces 
     //... 
} 

la parte discutibile è data ({cap}), che cos'è? Ridimensiona il vettore a una capacità di cap? (Ovviamente l'autore del codice si propone di fornire i dati di una dimensione del tappo durante la costruzione di esso.)

EDIT: dopo di leggere la prima risposta e di prova, sappiamo che il libro ha avuto errore nel frammento. Si intende fornire un cap iniziale, ma ha usato errato {}.

+0

http://en.cppreference.com/w/cpp/utility/initializer_list – BoBTFish

+5

[C++ 11 Fun con elenchi di inizializzatori, matrici ed enumerazioni] (http://stackoverflow.com/questions/8606315/c11-fun-with-initializer-lists-arrays-and-enumerations). Probabilmente dovresti consultare un riferimento C++ prima di fare domande. Le domande di sintassi di base possono essere risolte in questo modo. –

+0

'{cap}' dovrebbe essere una lista vuota di dimensione 8 se non mi sbaglio; quindi lo inizializzerà con una lunghezza predefinita di 8 .... o una lista con l'elemento 8, quindi finirai con quello. – Shark

risposta

4

Questo è inizializzazione uniforme, una nuova funzione C++ 11. Tuttavia, è probabilmente usato nel modo giusto nel tuo esempio. Dovrebbe essere:

Queue(const size_t &cap=8) : head(0),tail(0),count(0),data(cap) {} 
//              ^^^^^ 

perché l'intenzione è quella di richiamare il costruttore di std::vector<> che accetta la dimensione iniziale del vettore. Richiamando in questo modo:

data{cap} 

Oppure questo modo:

data({cap}) 

cause costruttore accetta un std::initializer_list di essere prelevati (liste di inizializzazione sono un'altra nuova caratteristica di C++ 11, strettamente correlata alla brace inizializzazione), risultante in un vettore inizializzato con un singolo elemento il cui valore è cap.

Potete verificare l'affermazione di cui sopra in questo live example (codice è riportato qui di seguito):

#include <vector> 

struct X 
{ 
    X(int s) : v1({s}), v2{s}, v3(s) { } 
    std::vector<int> v1; 
    std::vector<int> v2; 
    std::vector<int> v3; 
}; 

#include <iostream> 

int main() 
{ 
    X x(42); 
    std::cout << x.v1.size() << std::endl; // Prints 1 
    std::cout << x.v2.size() << std::endl; // Prints 1 
    std::cout << x.v3.size() << std::endl; // Prints 42 
} 
+0

Devo chiedere - guardando il 'cap' dall'esempio dell'OP, fa' {cap} 'si riferisce ad una' lista vuota di 8 elementi' o una 'lista che consiste di un 8 elemento'? :) – Shark

+0

@Shark: Quella è una lista di inizializzazione contenente 1 elemento il cui valore è '8' :) –

+0

Non è mai quello che si aspettava che fosse con C++ è ....: D – Shark

Problemi correlati