Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Bibliothèques > SL & STL
SL & STL Forum d'entraide C++ sur SL & STL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/12/2012, 09h56   #1
sone47
Membre régulier
 
Inscription : novembre 2006
Messages : 349
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 349
Points : 79
Points : 79
Par défaut map et set - clefs separées

Bonjour,

J'ai regardé le graph de la faq pour l'utilisation de conteneurs.
Le dernier choix pour lutiliser une map ou un set est le fait d'avoir les clefs et valeurs separées - et je n'arrive pas a a l'interprete sur un cas comme ci dessous:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class Unite
{
public:
    std::string mUnite;
    double mCoeff;
};
 
class Manager
{
public:
    std::map<std::string, Unite>  mPoolUnite; // Cle = Unite::mUnite
    // Ou std::set ?
};
La clef de ma map n'est que la string mUnite de Unite, donc elles ne sont pas separées, mais je ne vois pas en utilisant un set comment apres recuperer mes valeurs par rapport a cette clef..

Merci d'avance pour votre aide.
sone47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h24   #2
gbdivers
Responsable C++

 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 5 314
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 37
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 314
Points : 19 504
Points : 19 504
Bonjour

Je te laisse rechercher dans le forum pour tous les problèmes d'accessibilité aux variables membres, à la sémantique d'entité, etc (ou je laisse un autre compléter)...

Pour ton problème spécifique, il suffit que ta classe Unite soit comparable, càd qu'il faut lui fournir un opérateur de comparaison < ou spécialiser la fonction Less
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h12   #3
sone47
Membre régulier
 
Inscription : novembre 2006
Messages : 349
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 349
Points : 79
Points : 79
Merci pour ta reponse,

Dois je aussi re-preciser l'operateur == afin qu'il puisse savoir si un element est deja inseré ? (mon egalite ne porte que sur ma string)

Question annexe sur une map pour ne pas recrrer un post:
Code :
1
2
3
4
5
6
7
8
9
 
std::map<std::string, K*> mMap;
K * k1 = new K(...);
K * k2 = new K(...);
mMap["test"] = k1;
// ...
// On travaille et perd l'adresse du k1
// ...
mMap["test"] = k2;
L'insertion du k2 remplace donc le k1 et vu qu'on n'a pas stocké k1 on ne peut plus delete;
Doit on donc passer par une recherche de l'element, le supprimer s'il existe et enfin inserer le nouveau ?
sone47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h20   #4
gbdivers
Responsable C++

 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 5 314
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 37
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 314
Points : 19 504
Points : 19 504
Pour =, je sais plus, mais probablement que oui (le compilateur te le dira si c'est le cas). Par contre, attention à la sémantique

Pour map, oui, il faut faire un find pour vérifier qu'un élément existe et le supprimer si nécessaire (ou multimap si tu veux avoir plusieurs éléments avec la même clé), ou utiliser un pointeur intelligent
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 14h06   #5
JolyLoic
Rédacteur/Modérateur
 
Avatar de JolyLoic
 
Homme Loïc Joly
Développeur informatique
Inscription : août 2004
Messages : 4 675
Détails du profil
Informations personnelles :
Nom : Homme Loïc Joly
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2004
Messages : 4 675
Points : 9 897
Points : 9 897
Citation:
Envoyé par sone47 Voir le message
Merci pour ta reponse,

Dois je aussi re-preciser l'operateur == afin qu'il puisse savoir si un element est deja inseré ? (mon egalite ne porte que sur ma string)
Tu n'en n'a pas "besoin", car dans ta map, pour tester l'égalité, il se base sur l'opératuer < uniquement : si on n'a pas a<b, et que l'on n'a pas b<a, dans ce cas, il considère a==b.

Maintenant, pour d'autres usages de ta map, où tu pourrais être moins prudent, il me semble intéressant de définir l'opérateur == quand même (et qu'il donne les mêmes résultats que le tests à base d'operator<).

Citation:
Envoyé par sone47 Voir le message
Question annexe sur une map pour ne pas recrrer un post:
Code :
1
2
3
4
5
6
7
8
9
 
std::map<std::string, K*> mMap;
K * k1 = new K(...);
K * k2 = new K(...);
mMap["test"] = k1;
// ...
// On travaille et perd l'adresse du k1
// ...
mMap["test"] = k2;
L'insertion du k2 remplace donc le k1 et vu qu'on n'a pas stocké k1 on ne peut plus delete;
Oui, mais comme c'est très simple de se planter, il vaut mieux ne pas avoir des map de pointeurs, mais des map d'objets pour lesquels on n'a pas besoin de faire manuellement d'effacements, par exemples des map<string, shared_ptr<K>> ou (si ton compilateur les supporte) des map<string, unique_ptr<K>>
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
JolyLoic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 17h39   #6
sone47
Membre régulier
 
Inscription : novembre 2006
Messages : 349
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 349
Points : 79
Points : 79
Ok merci beaucoup pour vos réponses.
J'utilise un set sur des objets et non plus des pointeurs et j'ai definie <
Je regarderais après pour les passer en pointeur intelligent mais ca n'est pas la prio car petits objets et petits stockage.

Merci
sone47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h30.


 
 
 
 
Partenaires

Hébergement Web