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 :

STL/vector : conversion indice : "int" en iterateur


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut STL/vector : conversion indice : "int" en iterateur
    Bonjour,

    J'ai un souci pour supprimer un element d'un vecteur.

    Contexte: pour masquer la syntaxe parfois lourde ;-) de la STL, j'ai un patron de classe qui me permet d'encapsuler des listes d'objets dans quelque chose de très facile à utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class CMaListeDeTrucs : public CMaListe <Truc>
    {
    }
    Mon template (partiel) s'écrit:

    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
    template <class MMMM> class CMaListe 
    {
    	protected:
    		vector<MMMM> v;
    	public:
    		int GetNb()
    		{ return (int)v.size(); }
     
    		MMMM GetElem( int i )
    		{
    			ASSERT( i < v.size() ); // une macro à moi...
    			return v[i];
    		}
     
    		void AddElem( MMMM* elem )
    		{ v.push_back( *elem ); }
     
    		void List_Clear()
    		{ v.clear(); }
    ...
    }
    Ceci me permet d'utiliser la liste avec des méthodes qui "masquent" l'utilisation de la STL. Par exemple, je peux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CMaListeDeTrucs Liste;
    CTruc t1, t2;
    Liste.AddElem( t1 );
    Liste.AddElem( t2 );
    int n = Liste.GetNb();
    Mon problème se situe alors quand je veux implémenter une méthode de suppression d'un élément, tel que je puisse écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n = FonctionQuiChercheUnTrucParticulier( Liste ); // renvoie l'indice du Truc
    Liste.RemoveElem( n );
    Là, j'ai un problème dans la définition de cette méthode pour pouvoir supprimer le n-ième élément.

    Si j'écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void RemoveElem( int n )
    {
      v.erase( n );
    }
    Ca ne marche pas, il faut fournir un itérateur. Mais comment obtenir la valeur de l'itérateur à partir de la position, exprimée par un 'int' ? Le code suivant ne donne rien non plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void RemoveElem( int n )
    {
    	std::vector<MMMM>::iterator it = n;
    	v.erase( it );
    }
    J'ai bien lu
    http://cpp.developpez.com/faq/cpp/in...ssion_elements
    et également sur divers tutos sur le nert, mais je ne trouve rien de pertinent...

    Merci de votre aide.

  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
    Bonjour,
    comme c'est un vector tu devrai pouvoir faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void RemoveElem( int n )
    {
    v.erase( v.begin()+n);
    }

  3. #3
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Nickel !!!
    Merci beaucoup !
    C'est tout bête, mais j'y ait passé pas mal de temps...

    PS: serait-il possible d'ajouter ça dans la FAQ ? Je n'ai vu cette écriture nulle part, même pas dans le Delannoy...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    franchement, en faisant le wrapper, tu élimines toutes les possibilités des containers ( iterateurs, passage dans les algorithmes etc.. ).

    Quelle partie de la syntaxe te parait lourde?

  5. #5
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    franchement, en faisant le wrapper, tu élimines toutes les possibilités des containers ( iterateurs, passage dans les algorithmes etc.. ).
    Certes, encore que j'imagine (?) qu'on puisse wrapper aussi les algorithmes ( à verifier)

    Le fond, c'est que:
    1 - Je me suis construit pour une (assez grosse) appli un conteneur ayant la même interface, mais basé sur complètement autre chose que la STL (des séquences OpenCv, pour tout dire). L'idée, c'est de ne rien toucher à ce code, mais changer la façon dont le conteneur est implémenté (ce qui est -justement-l'un des principes de la POO, si je ne m'abuse...)
    2 - j'ai peu d'expérience avec la STL, jamais utilisé encore les algorithmes (pas encore eu besoin)

    Citation Envoyé par nikko34 Voir le message
    Quelle partie de la syntaxe te parait lourde?
    Bon, on va dire que c'est surtout un manque d'habitude ... Quand on découvre la STL, les notations du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int_vector::iterator it;
    for ( it = v.begin (); it != v.end (); ++it )
        {
       ...
    C'est pas très très intuitif, c'est moins "évident" que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for( int i=0; i<GetNb(); i++ )
    {
       CTruc* t = GetElem( i );
    }
    pour quelqu'un qui "vient" du C comme moi... Mais, promis, je vais me pencher sur tout ça !

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Rien ne t'empêche d'utiliser ton vector comme un tableau classique pour l'accès (fonction size() et opérateur []).

  7. #7
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Rien ne t'empêche d'utiliser ton vector comme un tableau classique pour l'accès (fonction size() et opérateur []).
    Oui... mais alors plus de protection contre les débordements. En intégrant la conteneur dans un wrappeur, je peux ajouter -ou pas- (compilation debug/release) une vérification de l'indice.
    Mais, bon, je ne chipoterai pas, j'ai bien conscience d'avoir une approche pas très orthodoxe...

    Merci à tous en tout cas

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par sebkramm Voir le message
    Oui... mais alors plus de protection contre les débordements. En intégrant la conteneur dans un wrappeur, je peux ajouter -ou pas- (compilation debug/release) une vérification de l'indice.
    la méthode .at() de ton vecteur te renvoie une exception si ton indice est foireux ( contrairement à [] ).

    Si c'est juste pour des parcours de tableau ( boucle for < size ), avec un itérateur tu es certain de ne jamais déborder.

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

Discussions similaires

  1. conversion d'un pointeur de données vers un STL vector
    Par velkouby dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/01/2008, 16h22
  2. [FLASH MX 2004] conversion string en int.
    Par calfater dans le forum Flash
    Réponses: 3
    Dernier message: 26/05/2004, 15h00

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