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

Signaler
Messages postés
10
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
20 décembre 2009
-
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
-
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

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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
Messages postés
10
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
20 décembre 2009

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.
Messages postés
10
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
20 décembre 2009

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]);
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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;
}