Un problème avec les tableaux dynamique multidimensionnel en c++

sonsonbm Messages postés 10 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 20 décembre 2009 - 22 nov. 2009 à 16:05
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 23 nov. 2009 à 17:57
je dois créer une application qui utilise une matrice qui a chaque ittération on lui ajoute une ligne et on la remplit avec un tableau qu'on a.
jai utilisé les vector
std::vector < std::vector > blackList(1, std::vector (5,0));
for(int jj=0;jj<5;jj++)
blackList[0][jj]=tabalgo[jj+1];
c'est pour initialiser la premiere ligne de la matrice
puis pour chaque ittération j'ai fait
//bk est un entier qui s'incrémente a chaque ittération
blackList.resize(bk);
for(int jj=0;jj<5;jj++)
blackList[bk-1][jj+1]=tabalgo[jj+1];
l'excécuttion se deroule bien si on enlève
"blackList[bk-1][jj+1]=tabalgo[jj+1];"
sinon elle se bloque dans la troisième ittération
je sais pas si c'est du programme ou bien il faut pas que j'utilise les vector pour les matrices dynamiques
aidez moi svp et je vous serez reconnaissante

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
23 nov. 2009 à 10:00
Tu n'as pas besoin de redimensionner un vecteur en C++. C'est géré automatiquement.

std::vector tab;
tab.push_back(4);
tab.push_back(5);
tab.push_back(6);

De même pour un tableau de tableau:

std::vector<std::vector > tabtab;
tabtab.push_back(tab);


A savoir: un vecteur de vecteur est assez horrible. Mieux vaut préférer un boost::multi_array:
http://www.boost.org/doc/libs/1_41_0/libs/multi_array/doc/user.html
0
sonsonbm Messages postés 10 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 20 décembre 2009
23 nov. 2009 à 16:19
Merci bien
je vais explorer ce lien c'est tout ce que je chercher.
Une idée d'ou commencer car quand on se bloque, on trouve plus d'idée.
0
sonsonbm Messages postés 10 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 20 décembre 2009
23 nov. 2009 à 17:29
j'ai vu ces liens j'ai compris qu'il s'agit de création des tableaux multiimensionnels.la déclaration et son parcours est assez facile mais j'ai pas compris comment c'est dynamique.
moi a chaque ittération je dois ajouter une ligne.
au debut je declare une matrice a une seule ligne et 5 colonnes puis a chaque ittération j'ajoute une ligne.
pou la declaration jai su qu'il faut mettre ce code la
#include "boost/multi_array.hpp"
int main()
{
boost::multi_array tab(boost::extents[1][5]);
for(int i=0;i<tab.size()<i++)
for(intj=0;j<5;j++)
tab[i][j]=0;
c'est la matrice crée normalement
0 0 0 0 0
je sais pas si c'est juste de faire tab.size()
puis a la prochaine ittération j'ajoute une ligne est ce que c'est juste d'écrire
tab.resize(boost::extents[2][5]);
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 nov. 2009 à 17:57
Si tu veux vraiment un tableau dont l'une des dimensions est statiques, tu peux procéder comme suit:

#include 
#include <vector>
#include <cassert>

template <class T, long Size>
class StaticArray
{
public:
  StaticArray()
  {
  }
  StaticArray(const T& t)
  {
    initialise(t);
  }
  long size() const
  {
    return Size;
  }
  bool isValidIndex(long index) const
  {
    return index >= 0 && index < Size;
  }
  size_t getNoOfBytes() const
  {
    return Size * sizeof(T);
  }

  T& operator[](long index)
  {
    assert(isValidIndex(index));
    return _data[index];
  }

  const T& operator[](long index)const
  {
    assert(isValidIndex(index));
    return _data[index];
  }

  void  initialise(const T& t)
  {
    for (long i = 0; i < Size; ++i)
      _data[i] = t;
  }

  void initialise(long start,long end,const T& t)
  {
    for (long i = start; i < end; ++i)
      (*this)[i] = t;
  }

protected:
  T  _data[Size];
};

void display(const std::vector<StaticArray >& tab)
{
  for (size_t i = 0; i < tab.size(); ++i)
  {
    for (int j = 0; j < tab[i].size(); ++j)
      std::cout << tab[i][j] << " ";
    std::cout << std::endl;
  }
}

int main()
{
  std::vector<StaticArray > tab;

  for (int i = 0; i < 10; ++i)
  {
    tab.resize(tab.size() + 1);
    for (int j = 0; j < 5; ++j)
      tab[i][j] = i + j * 10;
  }

  display(tab);

  return 0;
}
0
Rejoignez-nous