2009-11-03 31 views
35

C++ içindeki vektörler için memset eşdeğer bir işlevi var mı?Memset on vector C++

(Not clear() veya erase() yöntem, ben sadece tüm değerleri başlatmak istiyoruz, vektör boyutunu korumak istiyoruz.)

cevap

67

Kullanım std::fill():

std::fill(myVector.begin(), myVector.end(), 0); 
+5

Verimlilik konusunda endişeleriniz varsa, STL uygulamalarının çoğu, mümkünse memset yapan özel std :: fill uygulamalarına sahip olacaktır. – razeh

22

vektör POD türünü içerirse , üzerinde memset kullanmak güvenlidir - bir vektörün depolanması bitişik olduğu garanti edilir.

memset(&vec[0], 0, sizeof(vec[0]) * vec.size()); 

Düzenleme: sana tanımlanmamış bir terim atmak için Üzgünüz - POD Plain Old Data açılımı, yani C kullanılabilen türleri ve onlardan inşa yapıları.

Düzenleme tekrar: olarak boolvector<bool> ilginç bir istisnadır ve bunun üzerine memset kullanmaya çalışırsanız sefil başarısız olur, basit bir veri türü olmasına rağmen Açıklamalarda belirttiği. Adam Rosenfield's answer hala bu durumda mükemmel çalışıyor.

+0

POD türü nedir? – avd

+0

Teknik olarak, bir vektörün depolama alanı, C++ 03 standardı tarafından bitişik olarak% 100 garanti edilmez, ancak tüm uygulamalar bu şekilde uygulanır, bu yüzden MOR, POD tipleriyle gerçekten güvenlidir. C++ 0x, sorunu giderir ve tüm vektör uygulamalarının bitişik depolamayı kullanmasını gerektirir. –

+1

"Eski eski veriler" - tamsayılar, yapılar (yalnızca POD içeren), chars ... – LiraNuna

3

başka yolu da, ben Meyers kitabında ilk gördüğümde düşünüyorum:

// Swaps with a temporary. 
vec.swap(std::vector<int>(vec.size(), 0)); 

Onun tek dezavantajı bir kopyasını yapan şeydir.