La copie C++ Carte dans la clé et la valeur des vecteurs
J'ai un map
et je veux que la première colonne i.e (*it).first
être repoussé dans un vecteur alors (*it)->second
être repoussé dans un autre vecteur
Est-ce la meilleure façon de le faire?
std::vector<std::string>test;
for ( it=mymap.begin() ; it != mymap.end(); it++ )
{
test.push_back((*it).first);
}
Mon autre question est: si j'ai un i de la boucle.e
comment puis-je insérer tous les entiers i
en (*it).first
?
for(int i = 0; i < 10; i++)
{
//1 - 10 will go in (*it).first
}
Je veux avoir certains entiers dans (*it).first
et ont des valeurs associées à (*it).second;
Pourriez-vous préciser ce que me demandez-vous?
Votre "autre question" n'est pas clair.
comment mymap est-elle définie ?
plus d'information a été ajoutée maintenant
Votre "autre question" n'est pas clair.
comment mymap est-elle définie ?
plus d'information a été ajoutée maintenant
OriginalL'auteur CodersSC | 2012-03-28
Vous devez vous connecter pour publier un commentaire.
Votre première question, "comment puis-je pousser la première colonne de ma carte dans un vecteur et la 2ème colonne à l'autre" est résolu ainsi:
Votre deuxième question, "comment insérer tous les entiers
i
en(*it).first
?" est résolu ainsi:ou
std::map
de données-structures ne sont pas des tableaux à deux dimensions, ils sont ce qu'on appelle un cadre associatif de la structure des données, de sorte que vous ne devriez pas vraiment penser à la relation entre les paires clé/valeur que l'indexation dans un tableau. Au lieu de cela(*it).second
est la valeur d'une paire clé/valeur. Donc, en d'autres termes, si vous avez effectué une recherche pour la valeur(*it).first
dans la carte, il serait alors être directement associés à(*it).second
.Peut-être les commentaires que j'ai ajouté à mon exemple de code de le rendre plus clair.
Vous êtes de droite. Mais
.insert()
fonctionnera exactement la même recherche. En fait, sur mon ordinateur,operator[]
est rien de plus qu'un peu de wrapper autour deinsert()
. Dans mes tests,insert()
est toujours légèrement plus rapide, mais jamais plus de 20% plus vite.Vous avez raison, j'ai oublié que
insert()
retourne un itérateur à un élément existant, de sorte qu'il doit chercher, que. Je pense probablement un autre récipient. Nevermind.OriginalL'auteur Robᵩ
Utilisation
std::transform
.D'abord définir deux fonctions
key
etvalue
qui prennent la paire de chaînes et de retour de la première ou de la deuxième valeur, respectivement.Ensuite utiliser
std::transform
de<algorithm>
avec les fonctions de transformer la carte dans unvector
de clés ou unvector
de valeurs.De sortie:
OriginalL'auteur Peter Wood
Bien, il peut être fait avec une simple boucle:
Ou à l'aide de la
std::transform
algorithme, mais c'est assez détaillé ici:OriginalL'auteur Matthieu M.
En supposant que vous avez déclaré votre carte de clés de la chaîne et de la valeur (c'est à dire
map<string, string> mymap;
ce serait comme ci-dessous, également en supposant que vous avez déclarer, "elle", variable commemap<string, string>::iterator it
, etc:Pas sûr au sujet de votre question suivante.
mymap.end()
à chaque itération.OriginalL'auteur ManiP
La première partie de votre question:
Donc, oui un simple pour pouvez faire ce que vous voulez.
La deuxième partie de votre question:
Depuis que vous êtes à la mise à jour de la clé de la carte, vous devez le supprimer de la carte et insérez le changé. Donc:
De changer
first
par l'ajout de tous les entiersi
, ce serait vraiment dépendre du type defirst
. Par exemple avec une chaîne, vous peut dire quelque chose comme ceci:Ou si la première est par exemple un
set
, vous peut dire quelque chose comme ceci:OriginalL'auteur Shahbaz
Dans le cas d'un
std::map
, vous ne pouvez pas modifier l'itérateur renvoyé comme ça ... le membre clé (c'est à dire, la première) dans lestd::map
paire clé/valeur de la structure des données est volontairement désigné comme une valeur constante, et est initialisé à sa valeur constante au début de la paire clé/valeur de la durée de vie dans l'std::map
de la structure des données. Si les touches ne sont pas constants, vous vous retrouvez créant le chaos lorsque vous modifiez la clé, étant donné que les nœuds dans unstd::map
sont censés être triées à l'aide des touches. Le deuxième membre de la paire clé/valeur de la structure des données est le membre qui peut être changé.Donc, si vous voulez insérer un ensemble de paires clé/valeur dans une carte, il vous suffit d'effectuer les opérations suivantes:
OriginalL'auteur Jason
ici sera un itérateur qui pointe à l'un de la position sur la carte et au max ont un première et de la deuxième valeur pour un itérateur . Au maximum, vous pouvez avoir plusieurs clés ou même des clés identiques ou différentes valeurs en fonction de clé/valeur de la combinaison.
Aussi loin que de pousser la valeur dans le vecteur d'une clé à carte est à craindre, vous pouvez le faire de la même manière vous appuyez sur la touche
Neways vôtre question est très floue .
OriginalL'auteur Invictus
Juste au cas où vous voulez traiter avec différents types de données dans votre carte, je voudrais un modèle générique de la fonction de copie:
Il mélange:
Edit: oui __copie n'est pas la meilleure définition. Grâce
__copy
: c'est un comportement indéfini à utiliser des identificateurs par deux caractères de soulignement.OriginalL'auteur Dave