2009-11-03 47 views
35

¿Hay alguna función equivalente de memset para los vectores en C++?Memset en el vector C++

(No clear() o erase() método, quiero conservar el tamaño del vector, sólo quiero para inicializar todos los valores.)

Respuesta

67

Uso std::fill():

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

Si le preocupa la eficiencia, la mayoría de las implementaciones de STL tendrán implementaciones std :: fill especializadas que, en la medida de lo posible, harán memsets. – razeh

22

Si el vector contiene POD tipos , es seguro usar memset en él - se garantiza que el almacenamiento de un vector sea contiguo.

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

Editar: este momento para lanzar un término indefinido a usted - POD significa Plain Old Data, es decir, los tipos que estaban disponibles en C y las estructuras construidas a partir de ellos.

de nuevo Edit: Como se señaló en los comentarios, a pesar de que bool es un tipo de datos simple, vector<bool> es una excepción interesante y fracasará miserablemente si intenta utilizar memset en él. Adam Rosenfield's answer todavía funciona perfectamente en ese caso.

+0

¿Qué es el tipo POD? – avd

+0

Técnicamente, el almacenamiento de vectores no está 100% garantizado que sea contiguo al estándar C++ 03, pero todas las implementaciones lo implementan de esa manera, por lo que memset es seguro con los tipos de POD. C++ 0x soluciona el problema y requiere que todas las implementaciones vectoriales utilicen almacenamiento contiguo. –

+1

"Datos antiguos simples" - enteros, estructuras (que contienen solo POD), caracteres ... – LiraNuna

3

Otra forma, creo que lo vi por primera vez en el libro de Meyers:

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

Su único inconveniente es que hace una copia.