Matrice avec stl

eric -  
mamiemando Messages postés 34243 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

mamiemando Messages postés 34243 Date d'inscription   Statut Modérateur Dernière intervention   7 899
 
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