IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

grandes std::map, constructeur?


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut grandes std::map, constructeur?
    Bonjour à tous,

    je dois utiliser des map de grande taille (~ 1 000 000 de valeurs) contenant des double.
    L'immense majorité de ces doubles est 0, mais quatre ou cinq sont non nuls.
    Problème, j'ai besoin d'uiliser les zéros, et je dois donc les affecter quelque part.

    Je voudrais donc construire ma map avec une instruction comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map <unsigned, double> map (0.);
    et faire ensuite une affectation du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     map[a] = 3.;
    map[b] = -1.;
    map[c] = -1.;
    évitant ainsi de devoir parcourir toute la map en l'affectant à zéro avant d'insérer mes valeurs non-nulles.

    Seulement, je n'ai pas trouvé de constructeur idoine...

    Pourriez-vous m'aider svp?

    régis

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    tu prend pas le problème à l'envers?
    Si tous est à zéro sauf 4-5 valeurs. Ne serait il pas plus simple de sauvegarder uniquement ces 4-5 valeurs et tester si la clef en fait partie?

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Une map<unsigned, double> est vide au départ. Tu veux la remplir avec des Zéros ? Et avec quel clé associée ?

    J'ai l'impression qu'il te faut un simple vector:
    std::vector<double> v(1000000, 0.0);

    EDIT: de fait, il a d'autres méthodes plus efficaces pour gérer des tableaux creux. Et le map convient très bien, mais il faut n'y mettre que les valeurs "utiles".

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut
    salut et merci

    @camboui : j'ai besoin d'utiliser des map,
    parce que je travaille sur une bibliothèque existante qui construit des matrices creuses à partir de map (qui sont les vecteurs lignes)
    pour les clefs, c'est le numéro d'indice de colonne,

    @yan : pour les mêmes raisons, il me faut les zéros...

    j'ai toujours la solution simple de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (unsigned i = 0; i<size; i++) 
    {
            row[i] = 0.;
    }
    dès le début, mais bonjour la complexité...

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Si tu dois faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (unsigned i = 0; i<size; i++) 
    {
            row[i] = 0.;
    }
    alors tu dois utiliser un vector.
    Sinon c'est le map. Il n'y aucune raison de le remplir avec les valeurs creuses de ta matrice.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut
    je ne m'y connais pas trop,

    mais peut être qu'il suffit que je lui précise
    begin() et end() ?

    ou est ce qu'il le devine tout seul après les insertions?

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut

    tu es sur que ta lib utilise std::map comme un vecteur???

  8. #8
    Membre éprouvé Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Par défaut
    Citation Envoyé par regisportalez Voir le message
    évitant ainsi de devoir parcourir toute la map en l'affectant à zéro avant d'insérer mes valeurs non-nulles.
    En C++, comme en C, la mémoire est non-initialisée lors de la création d'une variable (i.e., une variable tout juste créée peut contenir n'importe quoi).
    Quoi qu'il arrive, le remplissage de ta map comprendra une boucle qui va parcourir les éléments de la map pour mettre les zéros.

    De plus, tu ne peux pas remplir une map lors de la construction parce que les clefs ne sont pas connues tant qu'elles ne sont pas assignées.
    Par exemple, le compilateur n'a aucun moyen de savoir qu'il va y avoir un élément my_map[machin] tant que tu ne lui as pas fait un my_map[machin] = truc.
    Même si tu lui dit "je veux une map d'un million de double avec des int pour clefs", il ne peut pas deviner que tu veux des clefs allant de 0 à 999999 (contrairement à un vector où les index sont forcément des entiers compris entre 0 et taille - 1).

    Enfin, si tu veux utiliser my_map.begin() et my_map.end(), comme tu as une map vide au début, il n'y a rien entre le begin et le end, et donc si tu fais un fill entre ces deux itérateurs, tu vas remplir rien du tout avec des zéros

    Ne te prends pas trop la tête avec ça, fais une boucle bête et méchante et, si tu vois que tu as vraiment un problème de performance à cause de ça, cherche une autre solution pour remplir ta map.
    L'optimisation prématurée est la source de tous les maux.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut
    ok merci à tous!

    depuis je me suis débrouillé. En fait j'avais un bug difficile à voir ailleurs dans le code, et je pensais, à tort, que ça venait des maps alors que non...

    J'ai appris des choses en tout cas, alors merci!

Discussions similaires

  1. std::map::find
    Par Blowih dans le forum SL & STL
    Réponses: 12
    Dernier message: 21/12/2005, 19h42
  2. Accession aux std::map triées ?
    Par Matthieu Brucher dans le forum SL & STL
    Réponses: 5
    Dernier message: 18/11/2005, 14h44
  3. std::map<int,CStringArray> ????
    Par philippe V dans le forum MFC
    Réponses: 1
    Dernier message: 12/10/2005, 06h48
  4. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  5. Trier un std::map selon les valeurs plutot que les clés
    Par dj.motte dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/11/2004, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo