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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| #include <iostream>
#include <iomanip>
#include <vector>
template <class T>
class Matrice
{
/* ce typedef n'est là que pour me faciliter l'écriture :p*/
typedef typename std::vector<T> mattype;
public:
/* et ceux-ci sont présents pour pouvoir utiliser les itérateurs
* habituels
*/
typedef typename mattype::iterator iterator;
typedef typename mattype::const_iterator const_iterator;
class Line
{
friend class Matrice;
private:
/* on ne peut pas créer nous meme une ligne*/
Line(const std::vector<T>& line):line(line),cells(line.size()){}
public:
/* mais on doit pouvoir la détruire, et les opérateur de copie et
* d'affectation peuvent être accessibles ;)
* (sauf si tu prévois de créer un trait de politique pour les
* pointeurs )
*/
~Line(){}
size_t size() const{return cells;}
T& operator[](size_t ind)
{
return line[ind];
}
private:
std::vector<T> line;
size_t cells;
};
Matrice(size_t lines=0, size_t cols=0):lines(lines), cols(cols),
mat(lines*cols)
{}
~Matrice(){}
void resize(size_t nlines, size_t ncols)
{
lines=nlines;
cols=ncols;
mat.resize(lines*cols);
}
size_t lineCount() const{return lines;}
size_t colCount() const {return cols;}
iterator begin(){return mat.begin();}
iterator end(){return mat.end();}
void put(const T& value, size_t line, size_t col)
{
mat[line*cols+col]=value;
}
T& getCell(size_t line, size_t col)
{
return mat[line*cols+col];
}
const T& getCell(size_t line, size_t col) const
{
return mat[line*cols+col];
}
Line GetLine(size_t num) const
{
--num;
Line ret(mattype(mat.begin()+(num*cols),mat.begin()+(num*cols)+cols));
return ret;
}
void SetLine(const Line& toset,size_t num)
{
--num;
mat.erase(mat.begin()+(num*cols),mat.begin()+(num*cols)+cols);
mat.insert(mat.begin()+num*cols,toset.line.begin(),toset.line.end());
}
private:
size_t lines;
size_t cols;
mattype mat;
};
using namespace std;
int main()
{
Matrice<int> mat;
mat.resize(10,10);
/* les deux lignes ci-dessus auraient très bien pu être remplacées par une
* seule:
Matrice<int> mat(10,10);
*/
cout<< "Initialisons la matrice"<<endl;
for(size_t i=0;i<10;i++)
for(size_t j=0;j<10;j++)
mat.put(i*10+j,i,j);
cout<<"elle fonctionne avec les itérateurs"<<endl;
for(Matrice<int>::iterator it=mat.begin();it!=mat.end();it++)
cout<<setw(4)<<(*it);
cout<<"... et avec la méthode getCell()"<<endl;
for(size_t i=0;i<mat.lineCount();i++)
{
for(size_t j=0;j<mat.colCount();j++)
cout<<setw(4)<<mat.getCell(i,j);
cout<<endl;
}
cout<<"on peut récupérer la troisième ligne pour voir"<<endl;
Matrice<int>::Line line=mat.GetLine(3);
for(size_t i=0;i<line.size();i++)
cout<<setw(4)<<line[i];
cout<<endl<<"la modifier"<<endl;
for(size_t i=0;i<line.size();i++)
{
line[i]=line[i]*2;
}
cout<<"et la replacer dans la matrice"<<endl;
mat.SetLine(line,3);
for(size_t i=0;i<mat.lineCount();i++)
{
for(size_t j=0;j<mat.colCount();j++)
cout<<setw(4)<<mat.getCell(i,j);
cout<<endl;
}
cout<<"le cinquième element de la sixieme ligne est "
<<mat.GetLine(6)[5]<<endl;
return 0;
} |
Partager