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 :

Trie de pointeurs dans un vecteur


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 56
    Points
    56
    Par défaut Trie de pointeurs dans un vecteur
    Bonjour a tous,

    Je suis actuellement entrain de coder l'algorithme de Huffman, et tout se passe bien mis a part le fait que j'ai un temps de compression tres long.
    J'ai reussi a cibler le probleme, celui ci se trouve dans mon Vector<GSheet>.
    Il s'agit d'un Vector que j'ai code, celui possede des methodes qui permettent d'ajouter un element au meilleur endroit afin que le Vector soit toujours trie.
    Ceci fonctionne tres bien car j'ai surcharge l'operateur<= de ma classe GSheet.
    Mais cela ne fonctionne pas lorsque j'ai un Vector<GSheet*> car la comparaison ne se fait non pas sur l'element mais sur l'adresse en memoire du pointeur. Ce qui ne m'interesse pas evidement.
    J'ai essaye beaucoup de surcharges d'operateur friend ou non. Rien ne passe.
    Si quelqu'un a une idee. Merci de me la communiquer car je l'attend avec impatience, je n'ai pas reussi a trouver en y passant l'apres midi.

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Sans quelques bribes de code, on ne peut rien faire.

    Mais voici un code rapide d'exemple:
    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
    47
    #include <iostream>
    #include <algorithm>
    #include <vector>
     
    struct Sorter
    {
        template <class T> bool operator()(const T a,const T b)
        {
    	return a<b;
        }
     
        template <class T> bool operator()(const T* a,const T* b)
        {
    	return *a<*b;
        }
    };
     
    struct Deleter
    {
        template<class T> void operator()(T* t)
        {
    	delete t;
        }
    };
     
    int main(int argc, char const *argv[])
    {
        std::vector<int*> v;
        v.push_back(new int(1));v.push_back(new int(5));v.push_back(new int(2));v.push_back(new int(-5));
        std::sort(v.begin(),v.end(),Sorter());
     
        for(int i=0;i<v.size();++i)
    	std::cout<<*v[i]<<std::endl;
     
        std::for_each(v.begin(),v.end(),Deleter());
        v.clear();
    std::cout<<"====="<<std::endl;
        std::vector<int> v2;
        v2.push_back(1);v2.push_back(5);v2.push_back(2);v2.push_back(-5);
        std::sort(v2.begin(),v2.end(),Sorter());
     
        for(int i=0;i<v2.size();++i)
    	std::cout<<v2[i]<<std::endl;
     
     
        return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Tu peux utiliser les templates pour résoudre ce problème:

    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
    #include <iostream>
     
    template< class T >
    struct IsPointer
    {
    	enum { type = false };
    };
     
    template< class T >
    struct IsPointer< T* >
    {
    	enum { type = true };
    };
     
    struct s{};
     
    int main()
    {
    	std::cout << IsPointer< s >::type << "\n"; // false
    	std::cout << IsPointer< s* >::type << "\n"; // true
    }
    Et ensuite adapter ton code:

    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
    47
    48
    49
    #include <iostream>
    #include <vector>
     
    template< class T >
    struct IsPointer
    {
    	enum { pointer = false };
    };
     
    template< class T >
    struct IsPointer< T* >
    {	
    	enum { pointer = true };
    };
     
    template< int T >
    struct Selector 
    {
    	enum { val = T };
    };
     
    template< class T >
    class Vector
    {
    	void insert_impl( T a, Selector< true > ) // pointer
    	{
    		std::cout << "inserting referenced value = " << *a;
    	}
     
    	void insert_impl( T a, Selector< false > ) // non-pointer
    	{
    		std::cout << "inserting value = " << a;
    	}
    public:
    	void insert( T a )
    	{
    		insert_impl( a, Selector< IsPointer< T >::pointer >() );
    	}
    };
     
     
    int main()
    {	
    	Vector< int* > v;
    	v.insert( new int(1) );
     
    	Vector< int > v2;
    	v2.insert( 2 );
    }
    Edit: En fait, la méthode de David est plusse mieux si tu peux l'appliquer

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 56
    Points
    56
    Par défaut
    Merci pour vos reponses.
    Mais je ne veux pas utiliser la librairie std, c'est d'ailleurs pour cela que je la recode.
    J'ai trouve une solution a l'instant qui m'a permis de passer de 40sec a 400ms de temps de traitement.
    Et le code de mes vector etant templete je ne peux y ajouter de specificites.
    Ma solution est donc simple : plutot que de faire determiner a la classe vector ou je dois placer cet element, je le fais faire par la methode qui ajoute dans le vecteur.
    Je vais quand meme prendre le temps d'etudier vos reponses, car elles peuvent mettre utiles pour la suite. La deuxieme me parrait bien car (je suis desole pour la std) elle n'utilise pas la std et permet pas mal d'adaptibilite.

    Merci beaucoup en tout cas.
    Et a bientot.

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Le code est voué à être exécuté dans de l'embarqué? (ou autre système critique?)
    Sinon y'a aucune raison de pas vouloir de la STL. (et même dans ces cas là...)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pourquoi ne pas utiliser un std::set ?

    Quand à l'adaptabilité, je ne veux pas être méchant mais je pense que la STL fait bien mieux que la plupart des gens...

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

Discussions similaires

  1. Pointeur vers objet dans un vecteur
    Par julieng31 dans le forum C++
    Réponses: 3
    Dernier message: 27/09/2013, 09h29
  2. Réponses: 1
    Dernier message: 25/06/2011, 22h14
  3. Problème de pointeur dans un vecteur
    Par sylsau dans le forum C++
    Réponses: 23
    Dernier message: 22/08/2007, 09h25
  4. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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