2009-11-03 21 views
35

Gibt es eine äquivalente Funktion von memset für Vektoren in C++?Memset auf Vektor C++

(nicht clear() oder erase() Methode, möchte ich die Größe des Vektors behalten, ich will nur alle Werte initialisieren.)

Antwort

67

Verwendung std::fill():

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

Wenn Sie sich Sorgen um die Effizienz machen, werden die meisten STL-Implementierungen spezialisierte std :: fill-Implementierungen haben, die, wenn möglich, Memes ausführen. – razeh

22

Wenn Ihr Vektor enthält POD Typen es ist sicher, memset darauf zu verwenden - die Speicherung eines Vektors ist garantiert zusammenhängend.

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

Edit: Leider eine nicht definierte Begriff auf Sie zu werfen - POD für Plain Old Data steht, das heißt die Typen, die in C und die Strukturen von ihnen gebaut verfügbar waren.

Bearbeiten wieder: Wie bereits in den Kommentaren aus, obwohl bool ein einfacher Datentyp ist, vector<bool> eine interessante Ausnahme und wird kläglich scheitern, wenn Sie versuchen, auf Memset zu verwenden. Adam Rosenfield's answer funktioniert immer noch perfekt in diesem Fall.

+0

Was ist POD-Typ? – avd

+0

Technisch gesehen ist der Speicher eines Vektors nicht zu 100% durch den C++ 03-Standard zusammenhängend, aber alle Implementierungen implementieren es so, sodass memset mit POD-Typen in der Tat sicher ist. C++ 0x behebt das Problem und erfordert, dass alle Vektorimplementierungen zusammenhängenden Speicher verwenden. –

+1

"Plain alte Daten" - Ganzzahlen, Strukturen (die nur PODs enthalten), Zeichen ... – LiraNuna

3

Ein anderer Weg, ich glaube, ich es zuerst in Meyers Buch sah:

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

Der einzige Nachteil ist, dass es eine Kopie macht.