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

C++ Discussion :

La STL c'est pour le type T


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut La STL c'est pour le type T
    Bonjour,

    Je demande si la STL avec ses avantages supposées ne fabrique pas une machine à gérer des objets, mais moins des pointeurs sur ces objets.

    Par exemple pour gérer un "vector" de type pointeur sur T ( T*) il faut faire du code supplémentaire et ennuyeux et parfois sans succès.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include  <iostream>
    #include  <vector>
    using namespace std ;
    void do1()
    {
       vector < double * > v ;
     
       for ( size_t i = 0 ; i < 16 ; i++ )
       { 
         double * z = new double( 1 + (i) * 10) ;
         v.push_back( z  )  ;
       }
       cout << v  ;
     
       // pour supprimer 
       delete v[2] ;  // ajouté sinon caca
       v.erase( v.begin() + 2 ) ;
     
       double * x1 = new double(-100.005) ;
       v.insert( v.begin() + 6, x1 ) ;  // ok 
     
       // pour réduire le vecteur
       for( size_t i = 7 ; i < v.size(); i++ )  //ajouté sinon caca
       delete v[i];
       v.resize(7);
     
       // pour affecter
       double * x2 = new double( -1 ) ;
       delete v[1]; // ajouté sinon caca
       v[1] = x2 ;
     
       // alors ce qui suit c'est la catastrophe 
       // fill( v.begin(), v.end(), x2 ) ;
       cout << v ;
     
       // Enfin le Chorus final 
       for( size_t i = 0 ; i < v.size() ; i++)
       delete v[i];
    }
     
    int main()
    {
      do1() ;
      return 0 ;
    }
    Evidemment pour maintenir la stabilité du code des concepteurs les utilisateurs doivent faire des efforts.

    Pour le pointeur sur T faut-il s'en remettre au magique pointeur ?

    Salut.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Pour le pointeur sur T faut-il s'en remettre au magique pointeur ?
    Pointeurs intelligents ? Oui. Ou à un boost::ptr_vector.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ton code plus haut n'est pas exception-safe.

    Tu peux avoir un vecteur de pointeurs, mais dans ce cas, il contient seulement des adresses. Si tu veux que le vecteur soit responsable de la durée de vie des objets pointés, faut utiliser autre chose...

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Ton code plus haut n'est pas exception-safe.

    Tu peux avoir un vecteur de pointeurs, mais dans ce cas, il contient seulement des adresses. Si tu veux que le vecteur soit responsable de la durée de vie des objets pointés, faut utiliser autre chose...
    Mouais pas terrible le vector de pointeurs. Il faudrait utiliser quoi au juste ?

    salut.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Pointeurs intelligents ? Oui. Ou à un boost::ptr_vector.
    Citation Envoyé par dj.motte Voir le message
    Mouais pas terrible le vector de pointeurs. Il faudrait utiliser quoi au juste ?
    Réponse dans le texte.

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Réponse dans le texte.
    C'est bien ce que je pensais. Le std::vector c'est à usage finalement assez naïf. C'est simple tant que l'on est sur le type T. Après il faut des prothèses pour y arriver.

    Et boost::ptr_vector ça fait partie de la STL ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Je vois pas trop le problème d'utiliser un vecteur de pointeurs, même stupides (pas intelligents quoi ). Mis à part le fait qu'il faut réserver l'utilisation des pointeurs aux cas vraiment nécessaires (polymorphisme, partage de données, etc), il ne faut jamais perdre de vue:

    - Qui crée l'objet pointé?
    - Qui détruit l'objet pointé?
    - La logique du programme permet-elle qu'un objet pointé soit détruit alors qu'il est encore utilisé ailleurs, i.e. rendre un pointeur invalide? (et attention dans les applications multi-thread, une synchronisation de l'accès aux données peut être nécessaire)

    Dans tous les cas, avec les pointeurs, il faut une vision globale pour pas se planter. Et même utiliser des pointeurs intelligents ne nous affranchit pas de devoir réfléchir un peu


    "A chaque new doit correspondre un delete."

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    J'ai l'impression que pour sauvegarder le squelette de la STL on est prêt à tous les sacrifices. La prothèse boost peut effectivement parer au nécessaire.
    Non. L'idée est de bénéficier de toute la puissance que nous donne c++. Plutôt que de définir n*m conteneurs "intelligents", ou n est le type de conteneur, et m la stratégie de gestion de la mémoire, on écrit n conteneurs, m "pointeurs" qui gèrent la mémoire, et on utilise la généricité pour demander au compilateur de générer les n*m conteneurs.

    Pour s'enfoncer dans les rajouts ce qu'il faut préserver c'est le défaut de conception.
    STL est considérée comme très bien conçue, je ne connais pas de grosses critiques à son encontre.

    Au fait je ne sais pas comment on déclare un vector< shared_ptr <toto> >
    std::vector<std::shared_ptr<toto> > ?

Discussions similaires

  1. Quel est pour vous le meilleur éditeur xml ?
    Par neo.51 dans le forum XML/XSL et SOAP
    Réponses: 87
    Dernier message: 20/02/2010, 20h04
  2. [AC-2000] la constante n'est pas valide pour ce type de contrôle
    Par niko8181 dans le forum IHM
    Réponses: 3
    Dernier message: 20/01/2010, 11h46
  3. Réponses: 5
    Dernier message: 14/11/2009, 01h11
  4. Réponses: 0
    Dernier message: 24/08/2009, 20h30
  5. Réponses: 4
    Dernier message: 05/09/2005, 22h58

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