OVH Cloud OVH Cloud

STL : vecteur de listes et listes de listes

14 réponses
Avatar
meow
Bonjour,

Juste une demande de confirmation :
- Apr=E8s essai, il semblerait que vector< list<bidule> > m'envoie
rapidement dans les choux. Aussi me demandes-je si les vecteurs peuvent
etre "param=E9t=E9s" avec des types de taille variable ?!
- qu'en est- il de list< list<bidule> > ?

4 réponses

1 2
Avatar
Anthony Fleury
Oui, tiens, c'est vrai, c'est quoi ça un objet de taille variable ?
Je supposes que j'ai encore un peu de mal avec certaines notions de
base... Tant mieux, il y a des gens ici pour me sortir de l'ornière.


Un objet a une taille fixe.

Qu'en est t'il d'un objet de type std::vector< int > ?
Un petit exemple jouet m'indique que sur mon systeme, quel que soit le
.reserve() que je fais dessus, la taille de mon tableau reste 12...


Oui mais ca c'est la « mauvaise manière » de vérifier la taille d'un
std::vector<>.
En fait, le 12 correspond à la taille de l'implémentation des
std::vector<> sur la machine en question. Cette implémentation va
comporter un pointeur sur une zone de mémoire qui sera allouée en
fonction des demandes. En cas de grosse demande de mémoire, une autre
zone sera alloué, et la première zone copiée dans la seconde.

La taille d'un std::vector<> n'est pas donnée par sizeof(). Sizeof() est
le moyen d'avoir la taille de la classe en elle-même, qui restera fixe,
mais pas de la zone mémoire pointée. La zone mémoire allouée a une
taille donnée par std::vector<>::capacity().

Cet exemple donne une explication de ce que je viens d'écrire :

#include <vector>
#include <iostream>

int main() {
std::vector<int> a;
std::cout << "Vide. Taille avec sizeof : " << sizeof(a) << " avec
size : " << a.capacity() << std::endl;
a.reserve(500);
std::cout << "Après reserve. Taille avec sizeof : " << sizeof(a) <<
" avec size : " << a.capacity() << std::endl;
}


Sur mon implémentation (dev-c++ sous Windows XP), on obtient :

C:Documents and SettingsAnthonyBureau>vector
Sans reserve. Taille avec sizeof : 12 avec size : 0
Après reserve. Taille avec sizeof : 12 avec size : 500

Oui, en fait, à bien y réfléchir, en fait je ne vois vraiment pas
comment on pourrait gérer des objets de taille variable !? Pourtant
j'ai pas fumé, je le jure !


Si jamais l'on voulait avoir un « objet de taille variable » (si tant
est que cette expression ait un sens), ce serait obligatoirement
(d'après la définition que j'ai d'objet), un objet de taille fixe que
l'on reconstruierait (donc par copie), à chaque changement de taille.

--
Anthony Fleury

Avatar
Marc Boyer
Le 28-11-2005, meow a écrit :
Oui, tiens, c'est vrai, c'est quoi ça un objet de taille variable ?
Je supposes que j'ai encore un peu de mal avec certaines notions de
base... Tant mieux, il y a des gens ici pour me sortir de l'ornière.


En fait, c'est la confusion entre une notion formelle de C++
et celle informelle utilisateur-programmeur.

Qu'en est t'il d'un objet de type std::vector< int > ?
Un petit exemple jouet m'indique que sur mon systeme, quel que soit le
.reserve() que je fais dessus, la taille de mon tableau reste 12...


std::vector<int> v;

sizeof(v) est la 'taille de l'objet v' au sens C++,
et c'est constant.
s.size() est la taille du vecteur c, au sens du programmeur.

s.size() peut changer dynamiquement (heureusement),
pas sizeof(v) à ma connaissance.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Avatar
Blue_Bear
Marc Boyer wrote:

Le 25-11-2005, meow a écrit :
Attention, std::list<type> n'est pas vraiment "de taille variable"
Certes... ça tient pas la route... J'ai donc du glisser une banane

ailleurs.
N'empeche ? Dans l'absolu, est-ce qu'on peut stocker des objets de
taille variable dans un vector ? dans un list ?


C'est quoi un object de taille variable ? Comment fais-tu cela,
et comment manipules-tu cela ?

Marc Boyer



char string[taille_variable]

peut être un bon exemple :)

bon là y a un truc vicieux c'est qu'à priori, il faut utiliser un
list<char*>
et que dans ce cas il faudrait bien faire gaffe avec la porté
des variables pour pas ouvrir la porte à un somptueux access vio



Avatar
kanze
Blue_Bear wrote:
Marc Boyer wrote:

Attention, std::list<type> n'est pas vraiment "de taille variable"
Certes... ça tient pas la route... J'ai donc du glisser une

banane ailleurs. N'empeche ? Dans l'absolu, est-ce qu'on
peut stocker des objets de taille variable dans un vector ?
dans un list ?


C'est quoi un object de taille variable ? Comment fais-tu cela,
et comment manipules-tu cela ?


char string[taille_variable]

peut être un bon exemple :)


C'est plutôt un exemple du code illégal. C'est légal en C, dans
certaines contextes, mais même là, ce n'est pas ce que
j'entendrais par « taille variable » ; la taille est fixée lors
de la création de l'objet, et ne varie plus.

Le problème ici, je crois, tourne autour de la définition de
«@taille ». Si on le considère comme le résultat de l'expression
sizeof, il n'y a pas d'objets de taille variable ni en C ni en
C++. En C++, en plus, les tailles sont même toutes connues au
compilateur. Mais on peut aussi bien avec taille vouloir
désigner toute la memoire utilisée par un object, ou le nombre
d'éléments dans une collection ; et ces tailles-là peuvent bien
être variable.

bon là y a un truc vicieux c'est qu'à priori, il faut utiliser
un list<char*>


Pourquoi ? Je verrais plutôt list<string>. S'il faut une liste ;
j'utilise vector<string> ou deque<string> bien plus souvent.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




1 2