Tableau, vector, list ou array????

eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 1 juin 2010 à 15:22
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 1 juin 2010 à 16:56
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
1 juin 2010 à 15:56
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]
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
1 juin 2010 à 16:19
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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
1 juin 2010 à 16:32
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]
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
1 juin 2010 à 16:56
Effectivement, je suis un peu grave, hehe...
Eh bien merci, je vais opter pour cette solution!!!!
0
Rejoignez-nous