Sto imparando C++ e ho cercato contenitori STL. Ho molte domande ma penso che questo possa andare per primo. Considera questa classe e il suo vettore.Perché i costrutti e le copie di inizializzazione del vettore?
class A {
int i;
// A(const A&);
public:
A(int i) : i(i) {cout << "consting " << i << endl;}
A(const A& ot) : i(ot.i) {cout << "copying " << i << endl;}
};
int main() {
vector<A> v1 = {A(1),A(2),A(3),A(4)};
vector<A> v2(1,A(5));
vector<A> v3;
v3.push_back(A(6));
}
mi dà l'uscita
consting 1
consting 2
consting 3
consting 4
copying 1
copying 2
copying 3
copying 4
consting 5
copying 5
consting 6
copying 6
Chiaramente è la costruzione e la copia di ogni A
.
C'è un modo per impedirlo. Quello che voglio dire è come posso evitare la copia extra e solo costruire A
nel vettore. È possibile? Se no, qualcuno può spiegare perché? Grazie.
EDIT: Solo per amor di completamento push_back
fa lo stesso
Il problema è che 'std :: initializer_list' "possiede" il suo contenuto in modo che ogni costruttore utilizza deve copiare gli elementi . Non ha senso ma è come funziona 'std :: initializer_list'. Sfortuna. – ipc
@ipc E gli altri casi di costruzione? è possibile per gli altri? –
@Aurora: In realtà, è molto più semplice di quanto tu possa pensare. Invece di aggiungere 'A (6)', basta aggiungere '6'. –