2012-06-02 48 views
11

Genellikle diğerine karşı kullanmak daha iyi olduğunda genellikle emin değilim. İkisi de genel olarak aynı şeyleri yapıyor gibi görünüyorlar, ama ne yapabildikleri açısından vektör daha esnek mi? Diziler ne zaman daha uygun?Vektörler ne zaman kullanılır ve C++ dizini ne zaman kullanılır?

+1

Neredeyse hiçbir zaman dizileri kullanmam benim öneridir. Ancak, dizi ile 'tür [] 'veya' std :: array' anlamına mı geliyorsunuz? –

+0

@ RichardJ.RossIII type [] –

+0

Bir vektör ile bir dizi arasındaki bir C++ anlamda temel fark, vektörlerin otomatik dinamik bellek yönetimi yaparken, dizilerin sabitlenmesidir. – chris

cevap

14

Genellikle hep imha otomatik olacağından vektör kapsamını söner ve ayrılan bellek öbek üzerinde özenle alınacaktır ve tüm bellek ele alınacaktır kez std::vector<T> kullanmayı tercih senin için. std::vector<T> bir dizide aldığınız her şeyi ve hatta öğelerin bellekte (std::vector<bool> hariç) sürekli olarak saklanacağını garanti eder. std::vector<bool> durumunda

böyle kod kıracak çünkü dikkatli olmak zorunda:

std::vector<bool> vb; 
vb.push_back(true); 
vb.push_back(false); 
vb.push_back(true); 
bool *pB = &vb[0]; 
if(*(pB+1)) 
{ 
    // do something 
} 

Gerçek olan, std::vector<bool> bitişik bool s saklamaz. Bu, C++ 11'de sabitlenen standartta bir istisnadır.

+2

Neyse ki std :: vektör 'bir kez daha gerçek bir kaptır. ** C++ 11 ** –

+0

@ K-ballo Right, bunun hesabını düzenlemek için düzenlenmiş. –

+0

+1, * dizgeye * düzgün bir şekilde ** yerleştirilecek * (vurgu benim), yani dizinin dışına yanlışlıkla yazılanlar yığını parçalayamaz. –

2

Yalnızca gömülü sistemler ile çalışırken veya belirli API'lerin gerektirdiği durumlarda dizileri gerçekten kullanıyorum (örneğin, bir işlev için bunları argüman olarak alma). Ayrıca, dizileri kullanmam gereken yalnızca bir veya iki yer varsa veya vektör işlevine özel olarak gereksinim duymuyorsanız, yalnızca vektör.h ek yükünden dolayı dizileri kullanmak daha mantıklıdır.

Aksi takdirde, sadece vektörleri :) kullanmak

+1

Vektörleri bir dizi beklerken geçirebilirsiniz: "someFunc (&v[0]);". – chris

+0

@chris, çok doğru. – kotakotakota

+0

Diğer noktanız geçerli olsa da. Diziyi nasıl ve ne sıklıkta kullandığınıza bağlı olarak programın ihtiyaçları, bir vektörün yükü aşırı olabilir – chris

İlgili konular