Tableau de taille variable en c++
pom
-
mostaf -
mostaf -
Bonjour, j'aimerais faire tableau dont sa taille varie au cour des itérations (en c++).
const int taille=4;
J'ai fait double * tab=new doube[taille];
mais taille doit etre constant.
L'idée est que je dois soit rajouter soit enlever des éléments de mon tableau tab.
merci
Pom
const int taille=4;
J'ai fait double * tab=new doube[taille];
mais taille doit etre constant.
L'idée est que je dois soit rajouter soit enlever des éléments de mon tableau tab.
merci
Pom
3 réponses
-
pouf, j'ai deux soluces:
surdimmensionnement ou liste:
struct{ de element et pointeur de struct}
Sinon, je vois pas (ou je ne me rappel plus, ca fait quand meme longtemps que je n'y ai pas touché à ce genre de dynamique).
pour add: suffit de faire un
p.next = (truc*)malloc(sizeof(truc));
p.next.val=elmt;
p.next.next = NULL;
heu malloc et new, c'est pareil sauf que c'est du C
tiens, ca peut aussi introduire une question:
Est-ce que l'OS fournit un bloc de memoire entier ou partitionné lors d'un appel à new?
Une remarque: quand tu tapes:
double * tab=new doube[taille];
ca revient à taper:
double tab[taille]; , sauf que tu fait appel à un truc de plus: new (pas bien pour l'allocation et portée), donc essai
double * tmp;
//traitement
tmp = new double[taille];
Mais bon, cette methode est pas terrible puisque si tu veux en changer la taille, il faut copier tous tes elements pour les remettre dans le nouveau tableau. Donc: complexite n
D'autant plus qu'il y aura,; à un moment donné deux instance de tableau à chaque modification. Entassement des free, new et copy, c'est plutot nul (et il faut bien penser à les effacer!!!) , mais bon, je peux me tromper! :) -
Slt Pom !!
Si tu veux faire des tableau dynamique utilise la STL ( Standart Template Library ) et utilise des listes, vecteur ou deque, etc ...
Chacune à ses caractéristiques au niveau des itérateurs ( = pointeur sur un objet de ton tableau ) ou vitesse de recherche d'un élément ( du à ses itérateurs ), etc ...
Et avec ses tableau dynamique tu peux ajouter des élément en retirer etc ... comme tu veux le faire pour ton tableau.
@++ !!
PS:
http://www.sgi.com/tech/stl/-
Salut grdTonioHardware !
Effectivement, je n'avais pas du tout penser à utiliser les vector. Mais lorsque j'avais fait un essai, choper l'élément i d'un vector est bien plus long que de choper l'élément i d'un double * m = new double[taille]
Sais-tu pourquoi ?
Je connais la fonction push_back qui rajoute un élément à la fin d'un vector mais quelle est la fonction qui supprime l'élément i ?
Et plus généralement, sais-tu où je pourrais trouver une liste de toutes les fonctions membes ?
merci
pom- Le mieux c'est d'utiliser une deque car comme ca tu as des Random Iterators donc tu peux accéder du premier coup à l'objet qui t'intéresse ca sera plus rapide.
Pour supprimer un élément tu doit avoir un truc qui s'apelle pop_back ou pop_front ou un truc dans le genre.
sinon tu as erase( iterator ) pour supprimer à un endrois i de ta deque.
voilà !!
@++ et bonne prog !!
-
-
-
Salut,
Si taille doit etre constant je ne vois pas pourquoi tu voudrais pouvoir enlever des elements.....
En allouant un tableau de cette maniere tu reserves un espace memoire suffisant pour stocker 4 double. Si ensuite tu veux "enlever" un element tu peux soit utiliser le fait de le mettre 0 ( ou un tout autre valeur pertinente) et faire des traitements particuliers lorsque tu le rencontres, soit decaler tes elements lorsque tu en supprimer une ( 1 2 3 4 => 1 3 4 0 si tu supprime 2) soit et c'est preferable, utiliser les structures adequates pour ce genre de pb comme les liste :-)
A+
Damien-
Salut damien, ma taille est constante car pour faire un tableau il faut que la taille soit constante, d'ou le const taille.
J'ai commencé mon prgm en mettant un -1 à la place de l'élément à retirer mais ca fait plein de test dans le prgm par la suite. Dès que je veux utiliser mon tableau, il faudra faire des tests.
pom
-