Matrice avec stl

eric -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour

Existe-t-il un type particulier pour definir une matrice avec la stl?
pour le moment je declare un:
vector< vector <int>>Matrix
Mais c pas pratique a utiliser.
Par exemple le Matrix.resize() ne marche pas

Merci

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Existe-t-il un type particulier pour definir une matrice avec la stl?
    pour le moment je declare un:
    vector< vector <int>>Matrix


    Ca c'en est une ;o)

    Mais c pas pratique a utiliser.
    Par exemple le Matrix.resize() ne marche pas


    Perso j'ai utilisé construit une classe de matrice creuse avec la classe set (listes chainées croisées "horizontalement" et "verticalement")
    class Maillon{
        protected:
        unsigned int ligne;
        unsigned int colonne;
    
        public:
        Maillon(unsigned const i,unsigned const j):ligne(i),colonne(j){};
        inline unsigned int getLigne() const{return ligne;}
        inline unsigned int getColonne() const{return colonne;}
    };
    
    struct cmpMaillon{
        bool operator()(Maillon const & a,Maillon const & b){
            return a.getLigne()<b.getLigne() || (a.getLigne()==b.getLigne() && a.getColonne()<b.getColonne());
        }
        bool operator()(Maillon const * a,Maillon const * b){
            return a->getLigne()<b->getLigne() || (a->getLigne()==b->getLigne() && a->getColonne()<b->getColonne());
        }
    };
    
    class Matrice{
        vector< set<Maillon*,cmpMaillon> > mat;
        bool setVal(unsigned int const i,unsigned int const j);
    //...
    };
    
    bool Matrice::setVal(unsigned int const i,unsigned int const j){
       return mat[i].insert(new Maillon(i,j)).second;
    }

    Bon j'ai un eu charcuté le code que j'utilise donc il y a peut être une ou deux erreurs mais c'est en gros l'idée ;o)

    Rq: contrairement à la solution avec des vectors, l'accès à M(i,j) n'est pas immédiat : la recherche se fait par dichotomie (et ouais c'est une matrice creuse). ceci dit c'est beaucoup plus léger en mémoire. Dans mon cas j'avais une matrice symétrique 600 000 x 600 000 et ça tournait bien.

    Bonne chance
    0