Recentemente Stavo rileggendo norma ISO C++, e l'ho trovato molto interessante nota:Come viene implementato l'inserimento di std :: vector? C++
Si noti che per
std::vector
, l'unico vincolo del tipo diT
std::vector<T>
è quel tipoT
deve avere costruttore di copia. In realtà, se la memoria del vettore è piena durante l'inserimento, viene allocata una nuova memoria disize = 2 * oldSize
(dipende dall'implementazione), quindi copia i vecchi elementi in essa contenuti e inserisce quell'elemento.
Ma aspetta ??
Per allocare nuova memoria di tipo l'abbiamo bisogno di qualcosa di simile, ptr = new T[2*size];
- come questo viene fatto, perché il tipo di
T
non può avere un costruttore di default? - Quindi assegnazione, dopo l'allocazione della memoria dobbiamo assegnare vecchi valori alla nuova memoria, giusto?
- Per tenere conto di queste 2 cose, come fa
std::vector
a fare questo con "SOLO COSTRUTTORE DI COPIA?" Quali sono gli idiomi di implementazione e lingua utilizzati?
È * non * fatto con array-'new'. Array -new' è una completa disfunzione del linguaggio e completamente inutile, come stai scoprendo. Invece, l'allocazione della memoria e la costruzione dell'oggetto sono completamente separate l'una dall'altra. –
Se non viene fornito un compilatore predefinito esplicito, il compilatore ne crea uno. – littleadv
@littleadv se la classe ha un costruttore definito dall'utente di qualsiasi tipo, quindi non esiste un costruttore predefinito generato dal compilatore –