Uczę się C++ i szukałem kontenerów STL. Mam wiele pytań, ale myślę, że to może być pierwsze. Rozważ tę klasę i wektor tego.Dlaczego inicjalizacja wektorowa tworzy i kopiuje?
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));
}
daje mi wyjście
consting 1
consting 2
consting 3
consting 4
copying 1
copying 2
copying 3
copying 4
consting 5
copying 5
consting 6
copying 6
Oczywiste jest konstruowanie i kopiując każdy A
.
Czy istnieje sposób, aby temu zapobiec. Mam na myśli to, jak mogę uniknąć dodatkowej kopii i po prostu skonstruować A
w wektorze. Czy to możliwe. Jeśli nie, ktoś może wyjaśnić, dlaczego? Dziękuję Ci.
EDIT: Wystarczy do realizacji w sake push_back
robi to samo
Problemem jest to, że 'std :: initializer_list'„posiada”to zawartość więc każdy konstruktor użyciem musi skopiować elementy . To nie ma sensu, ale tak działa 'std :: initializer_list'. Pech. – ipc
@ipc A co z pozostałymi skrzyniami konstrukcyjnymi? czy to możliwe dla innych? –
@Aurora: W rzeczywistości jest to znacznie łatwiejsze niż myślisz. Zamiast dodawać 'A (6)', po prostu dodaj '6'. –