web-dev-qa-db-fra.com

Memset sur le vecteur C++

Existe-t-il une fonction équivalente de memset pour les vecteurs en C++?

(Pas la méthode clear() ou erase(), je veux conserver la taille du vecteur, je veux juste initialiser toutes les valeurs.)

40
avd

Utilisez std::fill() :

std::fill(myVector.begin(), myVector.end(), 0);
74
Adam Rosenfield

Si votre vecteur contient POD types, vous pouvez utiliser memset dessus sans risque - le stockage d'un vecteur est assuré d'être contigu.

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

Edit: Désolé de vous lancer un terme non défini - POD signifie Plain Old Data , c’est-à-dire les types disponibles en C et les structures construites à partir de celles-ci.

Modifier à nouveau: Comme indiqué dans les commentaires, même si bool est un type de données simple, vector<bool> est une exception intéressante et échouera misérablement si vous essayez d'utiliser memset dessus. La réponse d'Adam Rosenfield fonctionne toujours parfaitement dans ce cas.

25
Mark Ransom

Une autre façon, je pense que je l'ai d'abord vu dans le livre de Meyers:

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

Son seul inconvénient est qu'il en fait une copie.

3
Tim Finer

Vous pouvez utiliser la méthode assign dans le vecteur:

Assigne un nouveau contenu au vecteur, remplace son contenu actuel et modifie sa taille en conséquence (si vous ne modifiez pas la taille du vecteur, passez simplement vec.size ()).

Par exemple:

vector<int> vec(10, 0);
for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 0 0 0 0 0 0 0 0 0 0 

// memset all the value in vec to 1,  vec.size() so don't change vec size
vec.assign(vec.size(), 1); // set every value -> 1

for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 1 1 1 1 1 1 1 1 1 1

Cité: http://www.cplusplus.com/reference/vector/vector/assign/

0
Jayhello