Tableau, vector, list ou array????

Signaler
Messages postés
57
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
24 avril 2013
-
Messages postés
57
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
24 avril 2013
-
Bonjour à tous,

j'ai une interrogation par rapport à l'utilisation d'un tableau...
Je dois manipuler une matrice de double et de taille fixe...
Sachant que je ne souhaite pas forcement la parcourir dans tous les sens, mais uniquement accéder à un élément de cette matrice puis le remplacer le cas échéant, qu'est ce qui est le mieux adapté...

Pour spécifier, j'ai une boucle de boucle dans laquelle je fais des calculs puis je modifie ma matrice au fur et à mesure de ces boucles, donc au début je pensais à un vector de vector, et l'accès à un élément se ferait via : monVector.begin()+compteur de boucle
Mais le remplcement d'un élément nécessite un erase suivi d'un insert? Est ce bien efficace, y t il pas des soucis de mémoire (car il y a bcp de remplacement de valeur)
Dans ce cas, l'utilisation d'un tableau à 2dim de double tou simple ne serait-il pas le mieux? ou une list ou un array?

Merci d'avance!!!

Peupeu

4 réponses

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Si tu es en C++, tu oublies les array du C.

Le vecteur est là si tu dois faire peux d'insertion, et si tu cherches à modifier des valeurs.
La liste est pratique si tu ajoutes souvent des éléments, et que tu les parcours. Elle ne te permet pas d'insérer un élément directement.
La queue/dequeue est pratique si tu ajoutes très souvent des éléments en début et fin de liste, et que tu retires des éléments en début/fin de liste.

Si tu dois remplacer un élément à chaque fois, et que ta taille est fixe dans les deux dimensions, alors je te conseille soit:
- Un vector de vector que tu dimensionnes à la bonne taille dès le début via "resize". Tu remplis alors juste ce qu'il faut.
- Un boost::multi_array, dont tu trouveras la documentation ici: http://www.boost.org/doc/libs/1_43_0/libs/multi_array/doc/user.html#sec_example

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
57
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
24 avril 2013

Et bien, j'ai peu d'insertion, mais pas mal de modification...
Comme je connais les vectors, je vais me diriger vers cette solution...
Néanmoins, pour modifier un élément de mon vector, ne dois pas faire un erase suivi d'un insert?
Parce que du coup, ca va faire pas mal d'insertion?

Peu
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Absolument pas ! Et heureusement :)

Exemple avec une matrice de 4x6:

#include 
#include <vector>

typedef std::vector<std::vector > Matrix;
typedef Matrix::iterator iter;
typedef Matrix::const_iterator citer;
typedef std::vector::const_iterator subIter;

void displayWithIterator(const Matrix& m)
{
  for (citer i = m.begin(); i != m.end(); ++i)
  {
    for (subIter j = i->begin(); j != i->end(); ++j)
      std::cout << *j << " ";
    std::cout << std::endl;
  }
}

void displayWithIndex(const Matrix& m)
{
  for (int i = 0; i < m.size(); ++i)
  {
    for (int j = 0; j < m[i].size(); ++j)
      std::cout << m[i][j] << " ";
    std::cout << std::endl;
  }
}


int main()
{
  Matrix tab;

  tab.resize(6);
  for (iter it = tab.begin(); it != tab.end(); ++it)
    it->resize(4);

  tab[0][0] = 45;
  // ...
  tab[5][3] = 18;

  displayWithIterator(tab);
  std::cout << std::endl;
  displayWithIndex(tab);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
57
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
24 avril 2013

Effectivement, je suis un peu grave, hehe...
Eh bien merci, je vais opter pour cette solution!!!!