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 :

std::map et initialisation de double


Sujet :

SL & STL C++

  1. #1
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut std::map et initialisation de double
    Bonjour,
    J'utilise un std::map<int, double> de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::map<int, double> sums;
    while (something) {
        sums[nextIndex()] += nextValue();
    }
    Puis-je être assuré que les valeurs initiales seront bien à zéro ?
    D'après le code de la STL, la valeur initiale est donnée par le constructeur par défaut. Dans le cas d'un double, il me semble que je ne suis assuré de rien.
    Faut-il donc spécialiser l'opérateur d'indexation dans le cas des doubles (et des int le cas échéant) ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    La norme dit que map[x] retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (*((insert(make_pair(x,T()))).first)).second
    Donc, à priori, je dirais :oui. Tu es assuré d'avoir une initialisation à 0.

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Alors ce que je n'ai pas compris, c'est pourquoi le T() va initialiser à 0.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    [Sous réserves]
    Tu as une autre règle qui dit que l'initialisation (double val = double(); ) pour les types scalaires se fait dans ce cas à 0.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je n'ai pas le standard sous la main, je ne pourrais donc pas répondre à la question, mais je me demandes si dans ton cas l'utilisation d'une map est la meilleure solution. En effet, si tes clés sont des entiers successifs, pourquoi ne pas utiliser un simple tableau? Tu y gagnerais en simplicité et en vitesse d'exécution (gain sans doute dérisoire certes).

    edit: je me demande également si ce ne serait pas plus propre de faire ta boucle en deux temps. Premièrement l'allocation et l'initialisation, et ensuite le remplissage, en utilisant un itérateur plutôt que l'opérateur [].

    edit2: le standard ne parle quasiment pas des types primitifs (la seule chose qu'il spécifie c'est une comparaison de leur taille en mémoire), donc T(), lorsque T est un type primitif (ici un double), peut être implémenté différemment selon les compilateurs (implementation defined).

  6. #6
    screetch
    Invité(e)
    Par défaut
    je ne pense pas que T() soit dépendant de l'implémentation, je suis même sur que ca serait une faute grave du standard.

    int i = int(); va initialiser i a 0.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Mais pourtant n'initialise pas i à 0. Enfin pas toujours (par exemple vc++ en mode Debug le fait).

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par r0d Voir le message
    Je n'ai pas le standard sous la main, je ne pourrais donc pas répondre à la question, mais je me demandes si dans ton cas l'utilisation d'une map est la meilleure solution. En effet, si tes clés sont des entiers successifs, pourquoi ne pas utiliser un simple tableau? Tu y gagnerais en simplicité et en vitesse d'exécution (gain sans doute dérisoire certes).
    Mes entiers ne sont pas consécutifs, il y aura des trous dans mon tableau.

    edit: je me demande également si ce ne serait pas plus propre de faire ta boucle en deux temps. Premièrement l'allocation et l'initialisation, et ensuite le remplissage, en utilisant un itérateur plutôt que l'opérateur [].
    Effectivement, je vais plutôt faire quelque chose de ce genre là, la vitesse d'exécution à tranché.

    edit2: le standard ne parle quasiment pas des types primitifs (la seule chose qu'il spécifie c'est une comparaison de leur taille en mémoire), donc T(), lorsque T est un type primitif (ici un double), peut être implémenté différemment selon les compilateurs (implementation defined).
    C'est ce qui m'intéressait principalement. Donc c'est bien un coup de bol si dans mon cas les valeurs de la map sont initialisées à 0.


    Merci pour vos réponses :-)

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    [Sous réserves]
    Tu as une autre règle qui dit que l'initialisation (double val = double(); ) pour les types scalaires se fait dans ce cas à 0.
    Citation Envoyé par r0d Voir le message
    edit2: le standard ne parle quasiment pas des types primitifs (la seule chose qu'il spécifie c'est une comparaison de leur taille en mémoire), donc T(), lorsque T est un type primitif (ici un double), peut être implémenté différemment selon les compilateurs (implementation defined).
    3DArchi a raison. Pour ceux qui voudraient des references: 5.2.3/2 Indique qu'il s'agit d'une "default-initialization" et 8.5/5 indique ce que c'est une "default-initialization".

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    J'ai donc dit une bêtise
    Merci Jean-Marc

  11. #11
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int i; //indéfini
    int j = int(); // j = 0
     
    class Test
    {
      int t1, t2;
      Test()
      : t2()
      {
        // t1 indéfini
        // t2 = 0
      }
    };

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    3DArchi a raison. Pour ceux qui voudraient des references: 5.2.3/2 Indique qu'il s'agit d'une "default-initialization" et 8.5/5 indique ce que c'est une "default-initialization".
    J'ai cru comprendre qu'ils emploient le terme de "zero-initialisation" dans lequel il est explicitement dit que pour les types scalaires l'initialisation est à 0.

    Ensuite
    Est une initialisation.
    Est une déclaration sans initialisation. Ici, effectivement, la valeur de i est indéfinie et la norme dit que son utilisation est indéterminée.

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'ai cru comprendre qu'ils emploient le terme de "zero-initialisation" dans lequel il est explicitement dit que pour les types scalaires l'initialisation est à 0.
    T() est une default-initialization. Pour les types scalaires, une default-initialization est une zero-initialization.

    Note: le CD du C++0X introduit des value-initialization et une default-initialization ne devient pas une zero-initialization. Mais 5.2.3/2 a ete aussi modifie pour que T() soit une value-initialization.

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    T() est une default-initialization. Pour les types scalaires, une default-initialization est une zero-initialization.

    Note: le CD du C++0X introduit des value-initialization et une default-initialization ne devient pas une zero-initialization. Mais 5.2.3/2 a ete aussi modifie pour que T() soit une value-initialization.
    OK !
    Je trouve 'zero-initialization' beaucoup plus explicite ...

  15. #15
    screetch
    Invité(e)
    Par défaut
    pour un double, 0.0 n'est pas obligatoirement représenté par des bits a 0

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par screetch Voir le message
    pour un double, 0.0 n'est pas obligatoirement représenté par des bits a 0
    Oui mais peu importe, 'zero-initialization' n'est pas défini par la norme par la mise à zéro des bits mais par la conversion de la valeur 0 vers le type scalaire.

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