2016-06-05 92 views
50

prendere il codice seguente:La capacità è stata copiata in un vettore?

std::vector<int> a; 
a.reserve(65536); 
std::vector<int> b(a); //NOTE: b is constructed from a 

a.reserve(65536); // no reallocation 
b.reserve(65536); 

è la capacità copiato? Ci sarà una riallocazione sull'ultima riga? Lo standard dice qualcosa o è silenzioso?

+0

Nella documentazione del vettore c-tors, si afferma che copia gli elementi. http://en.cppreference.com/w/cpp/container/vector/vector – paweldac

risposta

1

Ebbene, un semplice controllo come il seguente rivela che la capacità non viene copiato:

std::vector<int> a; 
a.reserve(65536); 
cout << "a.capacity is " << a.capacity() << endl; // prints 65536 

std::vector<int> b(a); //NOTE: b is constructed from a 
cout << "b.capacity is " << b.capacity() << endl; // prints 0 

credo che al momento la copia di vettore a-b, la capacità di b è impostato sulla dimensione di a in più compilatori; anche se questo non è garantito.

+6

Questo dimostra che la tua particolare implementazione non copia la capacità. Non ti dice se è un bug o no. –

3

Lo standard non dice nulla sulla conservazione della capacità quando si chiama il costruttore di copie. Quindi non hai alcuna garanzia al riguardo.

ma si può fare il seguente trucco, che scambiare A e di B dello stato, se avete bisogno di capacità di preservare nel solo la copia:

std::vector<int> a; 
a.reserve(65536); 
std::vector<int> b(a); 
b.swap(a); // now b has a's state 
assert(b.capacity() == 65536); 
+0

Questo scambio appena * che * chiamata 'riserva' causerà una riallocazione. Lo scambio –

+0

non fa nulla con l'allocatore, scambia solo lo stato degli oggetti. – AnatolyS

+0

Quindi è possibile scambiare i vettori con allocatori diversi? Se è così, non può semplicemente scambiare il singolo pezzo della memoria allocata. –

41

è la capacità copiato?

In pratica, n. L'ho provato online su Clang and GCC e su MSVC e nessuno di loro copiava la capacità.

Ci sarà una riallocazione sull'ultima riga?

Se la capacità è inferiore al argomento di prenotare (vale a dire non venga copiato) allora sì.

Lo standard dice qualcosa o è silenzioso?

Nessuna definizione per il costruttore di copie è fornita in vector.cons. Invece dobbiamo guardare al container.requirements

X denota una classe contenitore contenente oggetti di tipo T, a e b valori denotano di tipo X, u indica un identificatore, r indica un valore non-const di tipo X e rv denota un valore non costante di tipo X.

X u(a)

X u = a;

Richiede:T è CopyInsertable in X (vedi sotto).

postale: u == a

Ora, cosa significa per due contenitori essere uguali?

a == b

== è una relazione di equivalenza. equal(a.begin(), a.end(), b.begin(), b.end())

In altre parole, dal momento che non richiede capacity essere uguali nel confronto, quindi non c'è motivo per copiare il capacity.

+1

Il collegamento msvc non è corretto – P0W

+0

@ P0W Non esiste un modo semplice per visualizzare un collegamento a un esempio di codice diretto su rextester. –

+2

Vedere questo http://rextester.com/HWU52635 – P0W

4

No, la capacità non è garantita da una costruzione di copia vector.

Potete farlo come segue:

vector<int> b; 
b.reserve(a.capacity()); 
b = a; 

Meglio incapsulato in una funzione.