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.)
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.)
Verwendung std::fill()
:
std::fill(myVector.begin(), myVector.end(), 0);
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.
Was ist POD-Typ? – avd
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. –
"Plain alte Daten" - Ganzzahlen, Strukturen (die nur PODs enthalten), Zeichen ... – LiraNuna
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.
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