Classe masortingcielle C ++ – Suggestions

J’essaie de construire une classe Masortingx basée sur un modèle en C ++. Ci-dessous est sa mise en œuvre. J’ai mis en place deux opérateurs +, + = à partir de maintenant pour vous donner une idée de son apparence. Je pensais qu’il serait préférable de demander un retour d’informations avant de continuer.

L’ensemble de l’implémentation est public et il n’existe pas non plus de vérification explicite des liens / erreurs, car elle n’est pas censée être une bibliothèque de masortingce à part entière et évite donc tout code inutile.

Ce serait très utile si quelqu’un pouvait commenter et pourrait suggérer quelques améliorations ou suggestions.

Je vous remercie.

template class Masortingx { public: int r,c; vector< vector >mat; Masortingx() {} // Constructor to set the size of the masortingx Masortingx(int _r,int _c) { r=_r;c=_c; mat.resize(r); for(int i=0;i<r;i++) mat[i].resize(c); } // Constructor to build a matrix from a C 2d array // Pointer to the first element is passed (&arr[0][0]) Matrix(T *arr,int _r,int _c) { r=_r;c=_c; mat.resize(r); for(int i=0;i<r;i++) for(int j=0;j<c;j++) mat[i].push_back(arr[i*c+j]); } template Masortingx& operator +=(const Masortingx&M) { for(int i=0;i<r;i++) for(int j=0;j<c;j++) mat[i][j]+=static_cast(M.mat[i][j]); return *this; } template Masortingx operator +(const Masortingx&M) { Masortingxtmp=*this; return tmp+=M; } }; template istream& operator >>(istream &in,Masortingx&M) { in>>Mr>>Mc; Masortingxtmp(Mr,Mc); for(int i=0;i<Mr;i++) for(int j=0;j>tmp.mat[i][j]; M=tmp; return in; } template ostream& operator <<(ostream &out,MatrixM) { for(int i=0;i<Mr;i++) { for(int j=0;j<Mc;j++) cout<<M.mat[i][j]<<" "; cout<<endl; } return out; } 

EDIT: Merci à tous pour les suggestions.

J’ai juste une petite question, disons que je veux implémenter la vérification d’erreur (ex: vérifier les limites, les arguments valides, etc.) mais je veux que l’utilisateur fournisse une option pour désactiver complètement la vérification d’erreur, y a-t-il un bon moyen de mettre en œuvre cela? Ce dont j’ai besoin, c’est quelque chose comme exemple: `ios_base :: sync_with_stdio (0) ;. Merci encore.

Quelques points:

  • Utilisez un seul std::vector au lieu de std::vector> . Indexez-le avec y * r + x – utilisez et la surcharge de l’opérateur pour rendre cela plus facile (voir point suivant). Ce sera plus efficace en mémoire et un peu plus rapide (et votre init sera beaucoup plus facile: resize(r*c) ).
  • Rendez vos données membres privées afin de protéger votre masortingce contre les changements de taille involontaires. Par exemple, le code utilisateur peut actuellement redimensionner les vecteurs mais laisser les anciens r et c .
  • operator() surcharge operator() pour accéder à la masortingce (tant const que non const). Si vous devez réellement utiliser la syntaxe masortingx[r][c] au lieu de masortingx(r,c) , envisagez de surcharger l’ operator[] et de renvoyer un iterator à la ligne correcte (les iterators de vecteurs sont à access aléatoire, ils fourniront donc l’ operator[] ).
  • Implémentez à la place l’ operator+ tant que fonction non membre non amie – Améliore l’encapsulation!
  • Utilisez les listes d’initialisation comme d’autres suggérées.
  • Laissez le constructeur qui prend actuellement un T* prend un iterator à la place. De cette façon, vous obtenez automatiquement la prise en charge des pointeurs ainsi que de nombreuses autres fonctionnalités intéressantes, telles que la vérification de la plage pour les iterators de débogage, la conversion automatique des types pour les types de valeur compatibles et la prise en charge de tous les autres iterators à access aléatoire. Pensez également à remplir votre masortingce par lignes afin que vous puissiez également utiliser des iterators.

Si vous voulez savoir comment cela se passe correctement, voir la mise en œuvre du projet Eigen:

https://bitbucket.org/eigen/eigen/src/49e00a2e570c/Eigen/src/Core/Masortingx.h

https://bitbucket.org/eigen/eigen/src/49e00a2e570c/Eigen/src/Core/MasortingxBase.h

Eigen est une bibliothèque masortingcielle rapide de modèles lourds pour C ++. Je suis sûr qu’il y a beaucoup d’utilité ici.

1. Utilisez les listes d’initialisation pour les constructeurs tels que, Masortingx (...) : r(_r), c(_c)

2. operator + peut être simplement { return this->Add(M) } (en supposant que les noms de types T et U soient compatibles et que vous ayez implémenté une méthode Add ()). 3. Si vous construisez quelque chose à partir d’un tableau 2D, utilisez la technique ci-dessous:

 template class Masortingx { public: // ... void Construct (T *arr) { mat.resize(r); for(int i=0;i Masortingx(T (&arr)[ROW][COL]) : r(ROW), c(COL) { Construct(arr); } //... }; 

Ainsi, vous n’avez pas à passer la taille du tableau 2D lorsque vous appelez, cela réduira la probabilité d’erreurs.

  1. Pour une meilleure lisibilité, vous pouvez utiliser de meilleurs noms pour les membres de la classe: soit this->r ou t_r .

Utilisez les listes d’initialisation lors de l’initialisation des arguments du constructeur:

  Masortingx(int _r,int _c) { r=_r;c=_c; 

..

devrait être:

  Masortingx(int _r,int _c) : r(_r), c(_c) { .... 
  1. Vous voudrez peut-être rendre les membres r , c et mat privés.
  2. Vos opérateurs de streaming ne sont pas symésortingques (l’ operator<< n'écrit pas r et c ).

Je ne voudrais pas utiliser un vecteur de vecteurs pour y parvenir. De cette façon, vous ajoutez beaucoup de frais généraux à toutes les recherches sans que vous en ayez réellement besoin. Allouez simplement un tableau de T une ou deux dimensions et utilisez-le à la place. Cela permettrait également une copie rapide vers d’autres instances d’object sans avoir à parcourir tous les champs et à réinitialiser l’ensemble de la masortingce.

Aussi, vous devriez faire en sorte que vos membres soient constants quand ils ne devraient pas être modifiés plus tard (dans votre exemple, r et c ). Pour les initialiser, utilisez simplement la liste des constructeurs dans le message de Tony.

Vous perdez votre temps à garder _r et _c car les vecteurs conservent leurs propres tailles.

Je me demande pourquoi vous avez utilisé la très coûteuse fonction push_back dans cette initialisation de classe:

 // Pointer to the first element is passed (&arr[0][0]) Masortingx(T *arr,int _r,int _c) { r=_r;c=_c; mat.resize(r); for(int i=0;i 

Puisque vous avez déjà le nombre de lignes et de colonnes, considérez ceci:

 // Pointer to the first element is passed (&arr[0][0]) Masortingx(T *arr,int _r,int _c) { r=_r;c=_c; mat.resize(r); for(int i=0;i 

Si vous avez à l’esprit la rapidité, n’implémentez pas vous-même une bibliothèque de masortingces, mais utilisez des bibliothèques Boost, je les ai utilisées dans certains projets et je me débrouille plutôt bien avec les architectures 32 et 64 bits