Comment mettre en place une structure dans std ::: vector

J’ai essayé d’initialiser le std :: vector

std::vector particles; 

avec des instances de la structure simple

 struct Particle { int id; double x; double y; double theta; double weight; }; 

en utilisant emplace avec une liste d’initialisation:

 num_particles = 1000; for (int i = 0; i < num_particles; i++) { particles.emplace_back({ i,0.0,0.0,0.0,1 }); } 

Mais j’ai l’erreur

C2660 “std :: vector> :: emplace_back”: la fonction n’accepte pas un argument

Comment puis-je résoudre ce problème?

std :: vector :: emplace attend également un iterator en tant qu’argument, car il insère l’élément avant la position de cet iterator. Si vous souhaitez simplement append des éléments au vecteur, utilisez emplace_back . Un autre problème est que l’ { i,0.0,0.0,1 } est une liste d’initialisation, pas de Particle . Si vous voulez instancier la structure Particle , vous devez en informer le compilateur: Particle{ i, 0.0, 0.0, 1 } . edit: C’est parce que emplace_back attend des arguments pour construire plus tard la structure Particle . Votre tentative ne fonctionnera donc pas car l’argument lui-même sera déduit en tant que liste d’initialisation.

D’autre part, le paramètre std::vector::push_back est dans ce cas de type Particle , vous pouvez donc ici passer cette liste d’init, car la construction d’objects de ce type s’appelle initialisation d’agrégat (c’est-à-dire Particle p = {i, 0.0, 0.0, 1} est valide).

Code final:

 for (int i = 0; i < num_particles; i++) { particles.push_back({i, 0.0, 0.0, 1}); } 

Vous avez plusieurs problèmes avec votre code:

  • Emplace prend un iterator comme point d’insertion, puis une liste de valeurs servant d’arguments à un constructeur.

  • Votre structure doit avoir un constructeur qui prend les valeurs que vous transmettez à emplace.

  • Votre code ne contient que 4 valeurs d’argument, mais votre structure Particle comporte 5 champs.

Essayez plutôt ce code:

 struct Particle { int id; double x; double y; double theta; double weight; Particle(int id, double x, double y, double theta, double weight) : id(id), x(x), y(y), theta(theta), weight(weight) { } }; 

Remarquez le constructeur là-bas. Et puis emplace, par exemple au début [juste un exemple qui n’insère pas à l’arrière (voir ci-dessous)]:

 std::vector particles; auto num_particles = 1000; for (int i = 0; i < num_particles; i++) { particles.emplace(particles.begin(), i, 0.0, 0.0, 1.0, 0.0); } 

Comme d'autres l'ont noté, si vous voulez simplement insérer sans spécifier une position spécifique dans le vecteur, vous pouvez utiliser emplace_back :

 std::vector particles; auto num_particles = 1000; for (int i = 0; i < num_particles; i++) { particles.emplace_back(i, 0.0, 0.0, 1.0, 0.0); } 

Ceci insère les éléments à la fin du vecteur.

Premièrement, std::vector::emplace exige que le premier argument transmis soit un iterator représentant la position où l’élément doit être inséré.

Deuxièmement, même si vous fournissez la position. Les types de modèles ne sont pas déduits pour initializer_lists . Voir initializer_list et déduction de type de modèle . Donc, ci-dessous va également échouer :

 particles.emplace( particles.end(), {i, 0.0, 0.0, 1, 1}); 

Puisqu’il n’y a pas de constructeur pouvant prendre la liste des initialiseurs, les étapes suivantes vont également échouer :

 particles.emplace( particles.end(), i, 0.0, 0.0, 1, 1); 

Vous utilisez soit insert ou push_back comme dans:

 particles.insert( particles.end(), {i, 0.0, 0.0, 1, 1}); particles.push_back({i, 0.0, 0.0, 1, 1}); 

ou emplace ou push_back:

 particles.emplace( particles.end(), Particles{i, 0.0, 0.0, 1, 1}); particles.emplace_back(Particles{i, 0.0, 0.0, 1, 1});