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> > ?
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
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.
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
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
Le 28-11-2005, meow <ben@agat.net> 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
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
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
Marc Boyer wrote:
Le 25-11-2005, meow <ben@agat.net> 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
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
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
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
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