2012-04-29 14 views
6

Come fa un std::vector<std::string> inizializzare la sua auto quando il seguente codice viene richiamatoCome funziona il costruttore di copie std :: vector?

std::vector<std::string> original; 
std::vector<std::string> newVector = original; 

Sembrerebbe come se il costruttore di copia sarebbe stata invocata su std::vector<std::string> new durante newVector = original, ma come sono le 's std::string portati sopra all'interno del orginal? Sono copie o nuovi std::string? Quindi la memoria è newVector[0] uguale a original[0].

Il motivo che mi chiedo è dire che faccio la seguente

#include <vector> 
#include <string> 
using namespace std; 

vector<string> globalVector; 

void Initialize() { 
    globalVector.push_back("One"); 
    globalVector.push_back("Two"); 
} 

void DoStuff() { 
    vector<string> t = globalVector; 
} 

int main(void) { 
    Initialize(); 
    DoStuff(); 
} 

t cadrà fuori del campo di applicazione della DoStuff (su una build non ottimizzata), ma se t è solo riempito con puntatori al std::string ' s in globalVector, potrebbe essere chiamato il distruttore e la memoria utilizzata in std::string cancellata, lì per fare globalVector[0] riempito con immondizia std::string 's dopo DoStuff viene chiamato?

Un guscio di noce, sostanzialmente chiedo, quando viene chiamato il costruttore di copia std::vector, come vengono copiati gli elementi all'interno?

+4

Abbastanza sicuro che questo era solo un esempio ma nel tuo primo blocco di codice, 'std :: vector new = original;', che 'new' non è un nome di variabile legale. Sono sicuro che tu sai che è una parola chiave riservata. –

+0

@ChrisA .: Hai ragione, era solo il codice di prova – chadb

risposta

12

std::vector e la maggior parte degli altri contenitori di libreria standard memorizzano gli elementi in base al valore. Gli elementi vengono copiati sull'inserimento o quando il contenitore viene copiato. std::string mantiene anche la propria copia dei dati, per quanto riguarda il suo utilizzo.

+3

Dove più == tutto. –

+2

@BenjaminLindley: hai ragione, per quanto riguarda l'utente del contenitore. Tuttavia, come probabilmente saprai, Stroustrup ci ricorda che alcuni contenitori, come 'std :: string', possono copiare dati * pigramente, * il che significa che l'azione di copia effettiva potrebbe non essere eseguita internamente fino a quando una delle stringhe (l'originale o la copia) viene utilizzata in un modo che richiede che sia stata eseguita. In ogni caso, penso che il rispondente sia tecnicamente corretto dire * più * in questo caso, specialmente nel modo in cui ha qualificato il suo uso. – thb

+2

@thb 'std :: string' è solo l'ordinamento di un contenitore, è limitato a" tipi di tipo char "(cioè non può memorizzare altri contenitori) e la copia su scrittura è deprecata ora che il multithreading è prevalente. – Potatoswatter

Problemi correlati