2009-11-03 17 views
35

Esiste una funzione equivalente di memset per i vettori in C++?Memset on vector C++

(Non clear() o erase() metodo, voglio mantenere la dimensione del vettore, voglio solo per inizializzare tutti i valori.)

risposta

67

Uso std::fill():

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

Se si è preoccupati per l'efficienza, la maggior parte delle implementazioni STL avrà implementazioni std :: fill specializzate che eseguono memsets laddove possibile. – razeh

22

Se il vettore contiene POD tipi , è sicuro usare memset su di esso - l'archiviazione di un vettore è garantita come contigua.

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

Edit: dispiace per gettare un termine indefinito a voi - POD sta per Plain Old Data, vale a dire i tipi che erano disponibili in C e le strutture costruite da loro.

Edit ancora: Come sottolineato nei commenti, anche se bool è un semplice tipo di dati, vector<bool> è un'eccezione interessante e fallirà miseramente se si tenta di utilizzare memset su di esso. Adam Rosenfield's answer funziona ancora perfettamente in quel caso.

+0

Che cos'è il tipo POD? – avd

+0

Tecnicamente, lo storage di un vettore non è garantito al 100% dallo standard C++ 03, ma tutte le implementazioni lo implementano in quel modo, quindi memset è davvero sicuro con i tipi di POD. C++ 0x risolve il problema e richiede che tutte le implementazioni dei vettori utilizzino lo storage contiguo. –

+1

"Plain old data" - interi, structs (che contengono solo POD), caratteri ... – LiraNuna

3

altro modo, penso che l'ho visto la prima volta nel libro Meyers:

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

suo unico svantaggio è che si fa una copia.