2011-03-11 30 views
7

Böyle bir 2B vektörün başlatılması tamam mı? (Burada 5x4 2D vectro'daki tüm değerler 3 olarak başlıyor)?Bir 2D Vector'u C++ 'da bir liner olarak başlatmak için kurucuları kullanmak tamam mı?

std::vector<std::vector<int> > foo(5, std::vector<int>(4, 3)); 

tamam davranmaya gibi görünüyor, ama her yerde insanlar) (döngüler ve push_back için böyle bir vektör başlatılıyor tavsiye görünüyor web üzerinde arayın. Başlangıçta tüm satırların aynı vektöre işaret etmesinden korkuyordum ama bu durum böyle görünmüyor. Bir şey mi eksik?

cevap

10

Bu mükemmel geçerlidir - Sen (siz örneğin farklı elemanların farklı değerler istiyorum) diğer çoğu durumlarda 3.

başlatıldı her elemanla ([5, 4] unsurları) 2D vektör alırsınız Tek liner kullanamazsınız - ve bu nedenle döngülere ihtiyaç duyarsınız.

3

Eh, kod geçerli olduğunu ve aslında sen (Doğru, amacınızı anlamış varsayarak) bunu yapmak istediğimizi yapar. o şekilde yapmayı Ancak

, genellikle verimsiz (en azından dil/kütüphaneden geçerli sürümünde) 'dir. Yukarıdaki başlatma, geçici bir vektör oluşturur ve ardından özgün alt vektörleri, orijinali kopyalayarak tarafından başlatır. Bu oldukça verimsiz olabilir. birçok durumda bu nedenle tek başına

std::vector<std::vector<int> > foo(5); 

üst düzey vektörü inşa etmek ve daha sonra üzerine yineleme ve

foo[i].resize(4, 3); 
+1

gibi bir şey yaparak yerinde bireysel alt vektörleri inşa etmek tercih edilebilir Tek katlı yaklaşımın maliyeti, tek bir iç geçici vektörün - yani çok ** verimsiz IMO'nun - yapımıdır. – Erik

+1

@ Erik: İnşaat * ve * imha. Ama sadece bu değil. Maliyet, aynı zamanda, yerinde inşanın gerçekleşmesi durumunda, vektör-vektör kopyalama maliyetinin tersine, vektör-vektör-kopyalama ile başlatma maliyetini de içerir. İlkel türler için farklılık aslında nitelikseldir. – AnT

+1

Gördüğüm gibi, kopya-ctor varyantı bir dizi memcpy-eşdeğer çağrıya varacak, ilmekler ise memset-eşdeğeri bir dizi aramayı değerlendirecek. En azından derleyici biraz iyileştiriyorsa. Evet, memcpy, memset'ten daha pahalı olarak düşünülebilir - ancak kaynak verileri muhtemelen önbellekte ve muhtemelen hedef verilerde değil, bu senaryo için pratik farklılıklar göreceğinizi sanmıyorum. Vektörler daha büyük veya karmaşık nesneler içeriyorsa, elbette, onun mürekkepleri için - okunabilirliği tercih eder. Bununla birlikte, puanınız oldukça geçerli, kopya cetveli * daha verimsiz olabilir. – Erik