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.)
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.)
Uso std::fill()
:
std::fill(myVector.begin(), myVector.end(), 0);
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.
Che cos'è il tipo POD? – avd
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. –
"Plain old data" - interi, structs (che contengono solo POD), caratteri ... – LiraNuna
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.
Se si è preoccupati per l'efficienza, la maggior parte delle implementazioni STL avrà implementazioni std :: fill specializzate che eseguono memsets laddove possibile. – razeh