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 :

problème avec la STL sous solaris


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut problème avec la STL sous solaris
    bonjour,

    le cmpilateur CC sous solaris n'aime pas les insert avec indication de position sur las map:

    le code suivant compile très bien sous VS2005, gcc linux (redhat) mais pas sous solaris avec comme compilo CC 5.5 .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
     
    #include <iostream>
    #include <vector>
    #include <map>
    #include <string>
     
    using namespace std;
     
     
    int main(int argc, char* argv[])
    {
     
      map<string ,int> m;
      map<string ,int>::iterator it;
     
     
     
      m.insert ( pair<string,int>("sofiane",100) );
      m.insert ( pair<string,int>("balabla",200) );
     
      it=m.end();
     
      m.insert (it, pair<string,int>("last",300));  //la ligne qui cause le problème
     
     
      for ( it=m.begin() ; it != m.end(); it++ )
          cout << (*it).first << " => " << (*it).second << endl;
     
         cout << endl;
     
      return 0;
     
    }
    voila ce que raconte le compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sofiane: CC -o exampl exampl.cpp
    "exampl.cpp", line 27: Error: Could not find a match for std::map<std::string,int>::insert(__rwstd::__rb_tree<std::string, std::pair<const std::string, int>, __rwstd::__select1st<std::pair<const std::string, int>, std::string>, std::less<std::string>, std::allocator<std::pair<const std::string, int>>>::iterator, std::pair<std::string, int>).
    1 Error(s) detected.
    sofiane:
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    La raison est peut être simple: tu ne devrais normalement pas choisir la position à laquelle s'effectue l'insertion dans une map, vu que la première partie de la pair (pair::first) correspond à... la clé utilisée pour trier la map...

    En effet, le principe de fonctionnement d'une std::map est de créer un arbre binaire de recherche sur base de la valeur de pair::first...

    Si c'est pour insérer l'élément en fin de map quoi qu'il arrive, autant utiliser une... liste chainée de pair (std::list< std::pair<std::string, int> > dans ton cas)

    Autre chose...

    J'ai pris l'habitude de préférer passer par make_pair pour la création d'une paire à insérer dans une map, mais peut être n'est-ce qu'une habitude idiote
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    screetch
    Invité(e)
    Par défaut
    le insert avec position n'est pas standard mais a été ajouté par la plupart des compilateurs. Mais ca reste pas standards.
    Pour koala : le premier iterateur est considéré comme un "hint", une indication de l'endroit ou l'insertion pourrait se faire
    sur la plupart des implémentations, le hint n'est considéré que si l'itérateur indique la position exacte ou l'insertion devrait se faire, sinon lar recherche de l'endroit a insérer repart du début.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par screetch Voir le message
    le insert avec position n'est pas standard mais a été ajouté par la plupart des compilateurs. Mais ca reste pas standards.
    C'est peut être pour cela que je ne l'ai jamais utilisé
    Pour koala : le premier iterateur est considéré comme un "hint", une indication de l'endroit ou l'insertion pourrait se faire
    sur la plupart des implémentations, le hint n'est considéré que si l'itérateur indique la position exacte ou l'insertion devrait se faire, sinon lar recherche de l'endroit a insérer repart du début.
    Je me demande dans quelle mesure cela ne fera pas perdre beaucoup plus de temps que ce que cela peut en faire gagner dans la plupart des cas...

    Car, restons réalistes: à moins qu'il ne s'agisse de désérialiser un flux créé à partir d'une std::map et donc, pour lequel les éléments arrivent, effectivement, dans l'ordre "idéal" pour l'insertion, cela oblige à effectuer un test supplémentaire dont le résultat sera le plus souvent... de reprendre au début... du moins, chaque fois que l'information à insérée sera fournie par l'utilisateur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut
    l'indication de la position lors d'une inserstion , si je ne me trempe pas , ne sert qu'à reduire la complexitée de l'algorithme d'insertion. le resultat d'une insertion dans une map reste le meme que ce soit en indique la position ou pas.

    est ce vrai ??

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut
    OK j'ai eu ma reponse

    Merci.

  7. #7
    screetch
    Invité(e)
    Par défaut
    koala : ca peut fonctionner dans certains cas et c'est pour ca que ca a ete ajouté. mais dans le cas standard, ca ne sert pas souvent, c'est pour ca que ca ne doit pas faire partie du standard

  8. #8
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Je me demande dans quelle mesure cela ne fera pas perdre beaucoup plus de temps que ce que cela peut en faire gagner dans la plupart des cas...
    Pourquoi l'utiliser dans la plupart des cas ? Comme l'a dit screech la version avec hint n'est utile que si l'on sait à l'avance où l'on doit insérer la paire. Par exemple, il arrive frequement que l'on sache que la paire doit être insérée tout à la fin ou tout au début et dans ce cas l'insertion est en O(1).

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Pourquoi l'utiliser dans la plupart des cas ? Comme l'a dit screech la version avec hint n'est utile que si l'on sait à l'avance où l'on doit insérer la paire. Par exemple, il arrive frequement que l'on sache que la paire doit être insérée tout à la fin ou tout au début et dans ce cas l'insertion est en O(1).
    C'est vrai que j'ai mal choisi ce terme...

    Je vous présente donc mes excuses pour m'être laisser emporter
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par screetch Voir le message
    le insert avec position n'est pas standard
    Citation Envoyé par La norme, 23.3.1/2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class map {
    ...
    iterator insert(iterator position, const value_type& x);
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    L'implémentation par défaut de la SL qui accompagne le compilo de Sun est celle de Roguewave qui date de 96 ou 95 je ne sais plus.
    Bref, nous sommes loin du standard (98).

    Pour t'en rapprocher, migre à l'implémentation de la STLport v4 (rajoute un -lib=stlport je crois). Par contre attention, cela veut dire qu'il faut absolument tout recompiler, y compris les COTS C++ que vous utilisez, et qu'il faut abandonner Tools++ de RW.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    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 Luc Hermitte Voir le message
    L'implémentation par défaut de la SL qui accompagne le compilo de Sun est celle de Roguewave qui date de 96 ou 95 je ne sais plus.
    Bref, nous sommes loin du standard (98).
    En prime elle est configuree pour ne supporter que ce que SunCC 5.0 supportait quand il est sorti (pas de templates membres si j'ai bonne memoire). Sun accorde une tres grande importance a la compatibilite binaire. Ce qui est inestimable quand on en a besoin, mais genant quand les choses evoluent et qu'on ne peut pas en profiter.

  13. #13
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Oui...
    C'est le genre de migrations auxquelles on réfléchit à deux fois. D'autant plus que Solaris, c'est en environnement professionnel, le genre d'environnement où l'on reste sur des vieux compilos aussi longtemps que l'on n'a pas un besoin absolu de passer à mieux.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec formulaire et sous formulaire
    Par Lnjam dans le forum Access
    Réponses: 2
    Dernier message: 28/01/2006, 17h52
  2. Problème avec un diapo sous IE
    Par Mucsy dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 06/01/2006, 00h40
  3. problème avec les div sous Mozilla
    Par MrsFrizz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2005, 11h54
  4. problème avec z-index sous firefox ???
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/09/2005, 20h39
  5. [Sybase]Problème avec le BCP sous Solaris
    Par sl dans le forum Sybase
    Réponses: 3
    Dernier message: 09/09/2004, 07h56

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