#include<vector>
#include<cassert>
#include<iostream>
class Matrix
{
using Storage = std::vector<int>;
size_t lines_;
size_t cols_;
Storage storage_;
size_t get(size_t x, size_t y) const
{
assert(x < lines_ && y < cols_);
return x*cols_+y;
}
public:
Matrix(size_t l,size_t c, int v = 0)
:lines_{l},cols_{c},storage_(l*c,v){}
int operator()(size_t x, size_t y) const {return storage_[get(x,y)];}
int & operator()(size_t x, size_t y){return storage_[get(x,y)];}
size_t lines() const { return lines_;}
size_t columns() const {return cols_;}
};
void print(Matrix const & m)
{
for( auto i= 0u ; i < m.lines() ; ++i) {
for( auto j = 0u ; i < m.columns() ; ++j) {
std::cout << m(i,j) << " ";
}
std::cout << "\n";
}
}
int main()
{
Matrix m{5,5};
print(m);
std::cout << "\n";
for( auto i= 0u ; i < m.lines() ; ++i) {
for( auto j = 0u ; i < m.columns() ; ++j) {
m(i,j) = i+j;
}
}
print(m);
return 0;
}
Voilà comment on fait un tableau 2D en C++, on laisse tomber les defines préhistoriques, les pointeurs approximatifs. Là on a un truc qui tient la route quelque soit la taille du tableau(dans des limites raisonnables, disons environ 1000000 x 1000000 en 32 bits...), qui marche sur tous les OS, compile avec tous les compilateurs supportant c++11 (sorti en 2011). En modifiant deux ou trois petites choses mineures, ça passera aussi sur tous les compilateurs supportant C++98 (sorti en 1998). Et si tu demandais à ton prof de t'apprendre C++ et pas l'égyptien ancien?
oui, j'ai écrit ça vite fait et au passage, j'ai oublié une paire de parenthèses, il fallait effectivement lire operator()(size_t x,size_t y), je corrige
Il n'y a rien de franchement compliqué, plutôt que de définir des accesseurs/mutateurs nommés genre get/set, je fais de mon tableau 2D un foncteur. Fondamentalement ça ne change rien, ça permet juste d'avoir une écriture du code utilisateur plus légère, très proche de celle qu'on utilise ordinairement en maths pour manipuler des tableaux/matrices 2D :)
Et par transformation affine, c'est généralisable à n'importe quelle dimension, pour de la 3D, les surcharges de () et la fonction privée get prendront 3 paramètres, seule la fonction privée get changera, au lieu de renvoyer x*cols_+y, elle renverra x*dy*y*dz+z, la taille totale étant dx*dy*dz
Comme l'ont dit mes VDD, size_t est utilisé partout où il est question d'exprimer une quantité entière, la taille d'un type, la longueur d'une chaîne de caractères, le nombre d'éléments dans un conteneur, la position d'un élément dans un tableau...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
Eug
Voilà comment on fait un tableau 2D en C++, on laisse tomber les defines préhistoriques, les pointeurs approximatifs. Là on a un truc qui tient la route quelque soit la taille du tableau(dans des limites raisonnables, disons environ 1000000 x 1000000 en 32 bits...), qui marche sur tous les OS, compile avec tous les compilateurs supportant c++11 (sorti en 2011). En modifiant deux ou trois petites choses mineures, ça passera aussi sur tous les compilateurs supportant C++98 (sorti en 1998). Et si tu demandais à ton prof de t'apprendre C++ et pas l'égyptien ancien?
Eug