2016-01-04 19 views
5

Esiste un modo per creare std::vector<C> di N elementi richiamando il costruttore predefinito per ognuno?Richiamare il costruttore predefinito per ogni elemento in built std :: vector

Il costruttore da size_type chiama il costruttore C una volta e quindi usa il suo costruttore di copie per il resto degli elementi.

+2

Potrebbe chiarire se sei bloccato con C++ 03? In caso contrario, non c'è alcun problema da risolvere. – juanchopanza

+0

Anzi, stavo usando default di Xcode GNU C++ stdlib (di default per le destinazioni di distribuzione più grandi almeno), che include la versione precedente di std :: vector. Con lo stdlib di LLVM non c'è davvero alcun problema. – Danra

+0

Se si imposta '-std = C++ 11' poi stdlib dovrebbe fare la cosa giusta anche se non è molto vecchio. – juanchopanza

risposta

5

Il costruttore da size_type chiama solo il costruttore di C una volta e quindi usa il suo costruttore di copie per il resto degli elementi.

Non valido dal C++11. Guardate std::vector::vector documentation:

...

vettore (conteggio size_type, const T & valore, const Allocatore & alloc = Allocatore()); (2)

vettore esplicito (conteggio size_type, const Allocator & alloc = Allocator()); (3)

...

E poi:

...

2) costruisce il contenitore con le copie di conteggio di elementi con valore valore.

3) Costruisce il contenitore con numero di default istanze di T. Non vengono effettuate copie.

...

quindi è necessario il terzo costruttore std::vector<C>(size)


Sembra che questo comportamento esiste solo dal c++11.

Non riesco a trovare un modo per farlo prima di c++11. Poiché nessun costruttore può fare ciò, l'opzione sarebbe stata quella di creare un vettore vuoto, prenotare e quindi gli elementi emplace_back. Ma emplace_back è dal c++11 quindi ... siamo di nuovo al punto di partenza.

+3

Per essere onesti, questo è cambiato tra il C++ e C++ 03 11 ... –

+0

@KerrekSB non sapeva che – bolov

+0

Già. C++ 11 ha ripulito un sacco di cose del genere. Con il suo modello di allocatore presumibilmente più utile, sono stati aggiunti in tutto il mondo più costruttori allocatore, e argomenti di default sono stati rimossi nello stesso lavaggio, presumibilmente per evitare ambiguità di sovraccarico. In ogni caso, C++ 11 ora fa argomenti di default molto meno rilevante, dal momento che i nuovi costruttori La delega permettono codice utente di definire più sovraccarichi costruttore facilmente (anche se il caso vettore non delega). –

3

solo fare questo:

std::vector<C> v(size) 

Esempio:

#include <iostream> 
#include <string> 
#include <vector> 
class C{ 
    public: 
    C(){ 
     std::cout << "constructor\n"; 
    } 
    C(C const&){ 
     std::cout << "copy/n"; 
    } 
}; 
int main() 
{ 
    std::vector<C> v(10); 

} 

risultati: (C++ 11/14)

constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 

Risultati: (C++ 98)

constructor 
copy 
copy 
copy 
copy 
copy 
copy 
copy 
copy 
copy 
copy 

Live Demo