¿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.)
¿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.)
Uso std::fill()
:
std::fill(myVector.begin(), myVector.end(), 0);
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.
¿Qué es el tipo POD? – avd
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. –
"Datos antiguos simples" - enteros, estructuras (que contienen solo POD), caracteres ... – LiraNuna
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.
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