Augmenter dynamiquement la taille d'un vecteur 2D

Signaler
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011
-
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
-
Bonjour à tous,

je voudrais pouvoir créer dynamiquement un tableau 2D en C++, donc d'après mes recherche c'est les vecteurs qu'il faut utiliser.

J'ai donc déclaré mon vecteur 2D comme ceci :
std::vector<std::vector> tabTRI;


J'ai un autre tableau qui lui n'a qu'une dimension et qui contient 973 entiers :
int tabBRUT[973];

Dans ce tableau les '0' sont enfait des séparateurs, ce sont les autres chiffres qui m'intéressent.



Ce que je veux faire c'est très simple je pense. Je balaye mon tabBRUT pour le recopier dans mon tabTRI et dès que je vois un zéro j'agrandis ma seconde dimension de 1.

un truc de ce genre:
for(i=0;i<974;i++)
{
if(tabBRUT(i)!=0) //si la valeur ne vaut pas 0
{
tabTRI[X=X+1][Y] //on augmente la première dimension du tableau
tabTRI[X][Y]=tabBRUT(i) //on range la valeur	
}
else //si la valeur vaut 0
{
tabTRI[X][Y=Y+1] //on augmente la deuxième dimension du tableau
}
}


Le problème que j'ai c'est que je ne sais pas comment augmenter les dimensions de mes vecteurs, ni comment remplir un vecteur 2D :(

Quelqu'un peux me débloquer svp?

13 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je ne sais pas trop ce que tu cherches à réaliser, mais voici quelques éléments de réponses:
- Un std::vector se redimensionne tout seul, dès que tu ajoutes des éléments dedans (via .push_back() par exemple)
- Tu peux préallouer une taille via .resize()
- N'oublie pas de lire le documentation: http://www.cplusplus.com/reference/stl/vector/

Enfin, avoir un std::vector de std::vector c'est assez moyen... Il y a potentiellement un problème de conception.
Les questions à se poser:
- Est-ce que les dimensions sont fixes ?
- Est-ce que pour chaque case de mon std::vector j'aurais des std::vector de même taille ou non ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

Je ré-explique plus clairement ce que je veux. J'ai un tableaux que j'appelle tabBRUT, il est composé de 973 entiers.
Je veux ranger son contenu dans un tableau 2D que j'appelle tabTRI.

//contenu de tabBRUT (tableau 1 dimension de départ)
15
2
9
654
84
15
0
678
184
5
0
646
687
11
158
0
127
0
154
2

//contenu de tabTRI (tableau 2 dimensions après traitement)
15	678	646	127	154
2	184	687		2
9	5	11
654		158
84
15


Maintenant c'est vrai que les vecteurs ne sont peut être pas la bonne solution, dans ce cas tu me conseil quoi?
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Maintenant c'est vrai que les vecteurs ne sont peut être pas la bonne solution

Je n'ai pas dit que ce n'était pas la bonne solution. Je t'ai juste dit de te poser des questions de conception. Un std::vector de std::vector n'est approprié que dans des cas assez particuliers. Notamment quand tu as un tableau qui contient des tableaux de tailles différentes. C'est ici le cas.

Dans ce cas, tu n'as besoin de faire que des push_back().

Algo:

Tu crées un std::vector<std::vector >
Pour debut à fin du tableau brut
  Tu crées un std::vector.
  pour chaque case qui n'est pas 0
    ajout via push_back() de l'élément au tableau
  fin pour
  Si la case est 0
    ajout du tableau temporaire au tableau de tableau.
  fin si
fin pour


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

Je ne comprends pas ce que tu dis lorsque tu dis : ajout du tableau temporaire au tableau de tableau.
Au moment ou toi tu fais ça, c'est la que je dois augmenter de 1 une des dimensions de mon tableau.

De plus quand tu dis : pour chaque case qui n'est pas 0
on est bien d'accord que c'est un if qu'il faut faire, pas un for?
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
c'est la que je dois augmenter de 1 une des dimensions de mon tableau.

Je viens de te le dire, tu ne te soucis pas de l'augmentation de la taille du tableau, c'est automatique...
Tu fais juste des ajouts au tableau via des push_back().

on est bien d'accord que c'est un if qu'il faut faire, pas un for?

Je te laisse réfléchir, je suis sur que tu peux trouver cette réponse par toi même.
Tu devrais pouvoir écrire ton algo maintenant.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

Je suis entrain d'essayer push_back, mais je n'arrive pas à l'utiliser sur un vecteur 2D :(

Si il n'aurait qu'une dimension sa donnerait cela tabTRI.push_back(tabBRUT(i))
Mais comment faire quand il y'a deux dimensions?

De plus avec push_back on est obligé de donner une valeur à écrire dans la case du tableau et quand moi je détecte un zéro il faudrait que je fasse un push_back sur la première dimension mais sans rien écrire dedans.

Je vois pas trop comment faire la
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
tabTRI.push_back(tabBRUT(i)); => tabTRI.push_back(tabBRUT[i]);

Mais comment faire quand il y'a deux dimensions?


Pour un "vecteur2D", c'est ultra simple. Petit exemple:
std::vector<std::vector > tab;
std::vector subTab;

subTab.push_back(45);
subTab.push_back(2);
subTab.push_back(789);

tab.push_back(subTab);


De plus avec push_back on est obligé de donner une valeur à écrire dans la case du tableau et quand moi je détecte un zéro il faudrait que je fasse un push_back sur la première dimension mais sans rien écrire dedans.

Si tu as un zéro, il te suffit de ne rien faire tout simplement.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

Bon plus tu m'explique moins je comprends mdr, il doit certainement y avoir une petite notion qui me manque...

lorsque tu fais ceci :
tab.push_back(subTab);

Enfait tu mets les 3 valeurs de subTab dans tab? c'est bien ça?

Mais vu que ton tab est en 2D tu fais comment pour rappeller tes valeurs après?
Est ce que
std::cout << tab(0,0) << tab(0,1) << tab(0,2);
renvoie 452789?

Admettons que ce soit bien ça et admettons que tu ai un autre subTab, par exemple subTab2 et que tu veuilles mettre celui ci dans tab(1,0) tab(1,1) tab(1,2) etc... tu ferais comment?
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
std::vector de std::vector n'est pas un tableau 2D, d'ailleurs une telle notion n'existe pas.
En informatique, un tableau à 2 dimensions est en fait un tableau contenant des tableaux.

En faisant tab.push_back(subTab), j'ajoute un tableau dans mon tableau.

Ex graphique:

Soit le valeurs 1, 2, 3, 0, 4, 0, 5, 6 à mettre dans un tableau à double dimensions (0 comme séparateur).
J'aurais les tableaux [1, 2, 3] et [4] et [5, 6] que je met dans un tableau (qui contient des tableaux).
Soit: [ [1, 2, 3], [4], [5, 6] ]

Donc
- À la case 0, j'ai [1, 2, 3]. Et donc à la case 0,0, j'ai 1, à la case 0,1 j'ai 2 et à la case 0,2 j'ai 3.
- À la case 1, j'ai [4]. Et donc à la case 1,0 j'ai 4.
- À la case 2, j'ai [5, 6]. Et donc à la case 2,0 j'ai 5, à la case 2,1 j'ai 6


Attention, pour accéder au élément ce n'est pas tab(x, y) mais tab[x][y].

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

Ok je viens de comprendre, enfait dans un vecteur 1D si on utilise push_back on ajoute les éléments ligne par ligne et avec un tableau 2D on ajoute les éléments tableau par tableau.

C'est cette notion que j'avais pas compris.

Mais du coup ce qui pose problème, c'est l'affichage de ce tableau en 2D, par ex pour l'afficher avec cout tt simplement c'est pas possible si on a pas mémoriser toutes les dimensions auparavant.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Bien sur que si...
Il faut vraiment que tu lises la documentation que je t'ai donné en lien.

1) Un vector possède un champs size() qui te donne sa taille.
2) Si tu utilises des iterator, la question ne se pose même pas.

Ex d'affichage d'un tableau:
typedef std::vector::const_iterator iter;
std::vector tab;
[...]// Du code.

for (iter it = tab.begin(); it != tab.end(); ++it)
  std::cout << *it << std::endl;


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

Ok c'est bon, ça tourne!!

Merci, à toi

Effectivement elle est pas mal ta doc ;) mais bon c'est de l'anglais dommage...
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Il va falloir apprendre l'anglais alors. Toutes les docs sont en anglais, le code est en anglais, tes commentaires doivent être en anglais, etc...

N'hésite pas à poster ce que tu as fait. D'une part pour que ceux qui suivent la conversation puissent en tirer quelque chose, d'autre part parce qu'on peut relire ton code et te conseiller sur celui-ci.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question