2014-07-03 14 views
5

ho un std::vector<std::vector<double>> e vorrei aggiungere alcuni elementi al fine di esso e questo è stato il mio processo:Piazzola di un vettore con lista di inizializzazione

std::vector<std::vector<double> > vec; 
vec.emplace_back({0,0}); 

ma questo non viene compilato, mentre il seguente farà:

std::vector<double> vector({0,0}); 

Perché non è possibile emplace_back costruire l'elemento in questa posizione? O cosa sto sbagliando?

Grazie per il vostro aiuto.

risposta

7

La deduzione del modello non può indovinare che l'elenco di inizializzazione racchiuso tra parentesi dovrebbe essere un vettore. Hai bisogno di essere esplicito:

vec.emplace_back(std::vector<double>{0.,0.}); 
+0

grazie, ma ho un'altra domanda a questo: Perché funziona per il secondo esempio? Poiché il compilatore ha informazioni simili sul tipo (emplace_back si aspetta di ottenere argomenti per un costruttore di std :: vector e così è il secondo esempio) – m47h

+0

Perché nel secondo esempio si chiama il costruttore del vettore, che può gestire l'elenco di inizializzazione direttamente. – marli

+3

Così efficacemente non stai emplacing, ma semplicemente spingi un elemento già costruito, piuttosto che costruire il vettore sul posto. –

6

La risposta precedente citato si potrebbe ottenere il codice per compilare quando si costruisce il vettore in linea e colloco questo. Ciò significa, tuttavia, che si sta chiamando il costruttore di movimento su un vettore temporaneo, il che significa che non si sta costruendo il vettore sul posto, mentre questo è l'intero motivo dell'utilizzo di emplace_back anziché di push_back.

Invece si dovrebbe lanciare la lista di inizializzazione a un initializer_list, in questo modo:

#include <vector> 
#include <initializer_list> 

int main() 
{ 
    std::vector<std::vector<int>> vec; 
    vec.emplace_back((std::initializer_list<int>){1,2}); 
} 
+0

Chiamerebbe effettivamente il costruttore di mosse, non il costruttore di copie. – Arcinde

+0

Buona cattura. Modificato la mia risposta. –

+0

Perché usi la sintassi del cast di vecchio stile '(std :: initializer_list ) {1,2}' qui invece della sintassi del costruttore 'std :: initializer_list ({1,2})'? – Peter

Problemi correlati