2013-04-10 22 views
5

C++ öğreniyorum ve STL konteynırlarına bakıyordum. Birçok sorum var ama bence ilk önce bu olabilir. Bu sınıfı ve onun vektörünü düşünün.Vektör sıfırlama neden oluşturuyor ve kopyalanıyor?

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)); 
} 

Açıkça inşa ve her A kopyalıyor bana çıktı

consting 1 
consting 2 
consting 3 
consting 4 
copying 1 
copying 2 
copying 3 
copying 4 
consting 5 
copying 5 
consting 6 
copying 6 

verir.

Bunu önlemenin bir yolu var mı? Demek istediğim, fazladan nasıl kopyalayabilirim ve vektöre A'u nasıl yapılandırabilirim. Bu mümkün mü? Değilse nedenini açıklayabilir mi? Teşekkür ederim.

DÜZENLEME: Tamamlama aşkına push_back Böyle başlatıcı liste yapıcısı kullanırken bir kopyasını sahip kaçınamaz aynı

+3

sorun std :: initializer_list' o yüzden her yapıcı o unsurları kopyalamak zorunda kullanarak içerik var "sahibi olan" 'olmasıdır . Mantıklı değil ama std :: initializer_list’in çalışması nasıl. Kötü şans. – ipc

+0

@ipc Diğer inşaat durumları nedir? Diğerleri için mümkün mü? –

+0

@Aurora: Aslında düşündüğünüzden çok daha kolay. 'A (6) 'yerine, sadece' 6 'ekleyin. –

cevap

3

yapar Sadece için. Bir alternatif nesnelerin her biri daha sonra emplace_back başında uygun kapasiteyi rezerve ve şudur:

vector<A> v1; 
v1.reserve(4); 
v1.emplace_back(1); 
v1.emplace_back(2); 
v1.emplace_back(3); 
v1.emplace_back(4); 

As you can see, bu yalnızca aşağıdaki çıkışı sonuçlanır:

consting 1 
consting 2 
consting 3 
consting 4 
+0

'emplace_back' yalnızca C++ 11'de kullanılabilir mi? –

+3

@Aurora Sağ, ama kullanmakta olduğunuz başlatıcı listesi kurucusu. –

+0

@Aurora: Doğru. Aynısı, kodunuzda kullandığınız listeler listelenmek için de geçerlidir. –

4

Maalesef liste başlatma std::vector ile kopyaları gerektirir . Eğer konteyner Sabit boyutlu olduğunu biliyorsanız, bir alternatif kullanmaktır bir std::array yerine:

std::array<A, 4> a1 = {{A(1),A(2),A(3),A(4)}}; 

stdout: 
consting 1 
consting 2 
consting 3 
consting 4 
+0

+1 İyi öneri. –

İlgili konular