J'ai une carte std :: map
et ma structure est définie comme suit.
struct Data { int x; int z; int y; };
dans La clé myMap est int et la valeur est le vecteur de la structure et je ne veux pas créer le vecteur ou la structure temporaire lors de l'insertion dans la carte. Y a-t-il une idée pour y parvenir?
3 Réponses :
Une méthode consiste à utiliser emplace
et std::move
myMap.emplace(key, std::move(myVec));
En utilisant std :: move code> vous pouvez construire le vecteur en dehors de la carte, puis déplacer ce vecteur dans la carte sans aucune copie.
Comme la réponse précédente l'a dit, vous pouvez utiliser emplace et std :: move, mais pour tester si cela ou toute autre solution fonctionne, je vous suggère de remplacer le constructeur, le constructeur de copie, le destructeur et l'opérateur d'affectation pour afficher quelque chose comme créé, copié, détruit, attribué respectivement, pour que vous sachiez ce qui se passe réellement et améliorez les performances.
Vous n'avez pas besoin d'initialiser explicitement les valeurs dans une carte. Lorsque vous accédez à une clé via Vous pouvez donc faire quelque chose comme p en toute sécurité > même si la clé 0 n'existe pas. Ensuite, il sera créé avec un vecteur vide comme valeur et la valeur opérateur []
a> qui n'existe pas dans la carte, il sera ajouté avec une valeur initialisée par défaut (un std :: vector
vide dans votre cas). myMap[0].push_back(myInstanceOfData)
myInstanceOfData
sera poussée vers ce nouveau vecteur à l'intérieur de la carte.
Je ne veux pas créer d'objet supplémentaire du vecteur Je veux insérer directement dans la carte sans avoir aucun objet du vecteur. Mieux en utilisant la liste d'initialisation
Vous ne créez pas d'objet supplémentaire ici. Vous n'avez que l'objet qui est stocké dans la carte. "insérer directement sur la carte sans avoir aucun objet du vecteur" - désolé, pas sûr de ce que vous voulez dire ici, vous avez une carte avec std :: vector
comme valeur, vous aurez toujours std :: vector
stocké dans la carte, car c'est ainsi que vous l'avez déclaré.
myMap [123]
renvoie une référence au vecteur à cette clé (en le créant s'il n'existe pas), doncmyMap [123] .push_back ({x, y, z}) ;
doit ajouter{x, y, z}
au vecteur nouvellement créé / existant sans utiliser de vecteur temporaire. Quelque chose comme onlinegdb.com/HJgoqrElkw