Si tu as un problème de ce type, il me semble que c'est a priori que tu
ferais mieux d'éviter std::vector et d'utiliser plutôt une std::list :
tu sous-entends qu'il est ici lourd et à éviter que de créer un
temporaire pour copie. Or le vecteur fait cela tout le temps dès que la
taille change, et le list permet de l'éviter.
Si tu as un problème de ce type, il me semble que c'est a priori que tu
ferais mieux d'éviter std::vector et d'utiliser plutôt une std::list :
tu sous-entends qu'il est ici lourd et à éviter que de créer un
temporaire pour copie. Or le vecteur fait cela tout le temps dès que la
taille change, et le list permet de l'éviter.
Si tu as un problème de ce type, il me semble que c'est a priori que tu
ferais mieux d'éviter std::vector et d'utiliser plutôt une std::list :
tu sous-entends qu'il est ici lourd et à éviter que de créer un
temporaire pour copie. Or le vecteur fait cela tout le temps dès que la
taille change, et le list permet de l'éviter.
(std::vector<>)
Comment ça, simple affectation de pointeur ?
(std::vector<>)
Comment ça, simple affectation de pointeur ?
(std::vector<>)
Comment ça, simple affectation de pointeur ?
Si on fait un resize avec une taille inférieure, il y a réallocation, ou
bien est-ce que cela garde la zone mémoire actuelle?
Si on fait un resize avec une taille inférieure, il y a réallocation, ou
bien est-ce que cela garde la zone mémoire actuelle?
Si on fait un resize avec une taille inférieure, il y a réallocation, ou
bien est-ce que cela garde la zone mémoire actuelle?
soit aussi, il "suffit" de créer un vector<T*> (et non vector<T>) si
l'on souhaite insérer des T*, mais je reboucle alors sur la réponse
faite à James, on peux souhaiter contrôler / réaliser l'instantiation
des items mais manipuler des références (et non des pointeurs) lors de
l'utilisation des opérateurs [] de vector<> et de ses itérateurs.
soit aussi, il "suffit" de créer un vector<T*> (et non vector<T>) si
l'on souhaite insérer des T*, mais je reboucle alors sur la réponse
faite à James, on peux souhaiter contrôler / réaliser l'instantiation
des items mais manipuler des références (et non des pointeurs) lors de
l'utilisation des opérateurs [] de vector<> et de ses itérateurs.
soit aussi, il "suffit" de créer un vector<T*> (et non vector<T>) si
l'on souhaite insérer des T*, mais je reboucle alors sur la réponse
faite à James, on peux souhaiter contrôler / réaliser l'instantiation
des items mais manipuler des références (et non des pointeurs) lors de
l'utilisation des opérateurs [] de vector<> et de ses itérateurs.
kanze wrote on 18/09/2006 19:12:ben parce que "cela créé un temporaire" !
C'est un peu la philosophie de base de C++. On a des
temporaires sur la pile, plutôt que seulement des objets
créés dynamiquement.
j'aime cette philosophie, la coexistence de variables statiques ET
dynamiques me va très bien également; non, je ne vois pas comment
efficacement sans passer.
c'est ici seulement l'interface de vector<> dont il est question.
- on peux vouloir la "classe vectorisée" non copiable.
On ne peut pas. C'est contre la philosophie de base. (En fait,
je vois mal comment ça serait implémentable.)
je suis également d'accord avec les exigences du contrat de
vector<>, je soulignais le trait pour indiquer qu'il a *IMHO*
un caractère négatif.
il reste toutefois des cas où on a bien affaire à des
instances qui doivent être non copiables (wrapper de resources
physiques par exemple, ou gestionnaire d'accès à une source
non multi-entrante, etc); de tels gestionnaires ne peuvent pas
être regroupés / utilisés via un vector<>.
- on peux, en effet, trouver étonnant le fait de transmettre
un truc ne servant qu'à être jeté (création tempo,
instantiation ptr, recopie, destruction; tout ça à la place
d'une simple affectation de pointeur ne parait pas très
vertueux).
Et quelle est l'alternative ? Crée tout dynamiquement, et ne
travailler qu'avec des pointeurs ?
une alternative simple serait de pouvoir transmettre un T* (et
même tout pointeur sur une classe assimilable à un T (T et ses
sous classes)).
l'organisation interne de vector<> passe nécessairement par
des pointeurs de la classe template, n'imposer que des
références à l'insertion ne me parait pas si indispensable.
(ok, tu vas me répondre que je n'ai pas le droit de lire la
définition du template ou d'en tirer des conclusions).
si la question était ouverte ("si" parce que heureusement 99%
des utilisateurs se foutent de l'avis qui suit), le mérite de
vector<> est son mécanisme allocator customisable (justement
pour traiter les références) et son redimensionnement, dans un
second temps ses itérateurs.
les 2 premiers points garantissent de travailler avec des
références (T&), c'est comme cela que je travaille dès que
possible donc il ne s'agirait pas de "travailler avec des
pointeurs", surtout pas; par contre je ne trouverais pas
gênant de faire un push(new T(...)).
kanze wrote on 18/09/2006 19:12:
ben parce que "cela créé un temporaire" !
C'est un peu la philosophie de base de C++. On a des
temporaires sur la pile, plutôt que seulement des objets
créés dynamiquement.
j'aime cette philosophie, la coexistence de variables statiques ET
dynamiques me va très bien également; non, je ne vois pas comment
efficacement sans passer.
c'est ici seulement l'interface de vector<> dont il est question.
- on peux vouloir la "classe vectorisée" non copiable.
On ne peut pas. C'est contre la philosophie de base. (En fait,
je vois mal comment ça serait implémentable.)
je suis également d'accord avec les exigences du contrat de
vector<>, je soulignais le trait pour indiquer qu'il a *IMHO*
un caractère négatif.
il reste toutefois des cas où on a bien affaire à des
instances qui doivent être non copiables (wrapper de resources
physiques par exemple, ou gestionnaire d'accès à une source
non multi-entrante, etc); de tels gestionnaires ne peuvent pas
être regroupés / utilisés via un vector<>.
- on peux, en effet, trouver étonnant le fait de transmettre
un truc ne servant qu'à être jeté (création tempo,
instantiation ptr, recopie, destruction; tout ça à la place
d'une simple affectation de pointeur ne parait pas très
vertueux).
Et quelle est l'alternative ? Crée tout dynamiquement, et ne
travailler qu'avec des pointeurs ?
une alternative simple serait de pouvoir transmettre un T* (et
même tout pointeur sur une classe assimilable à un T (T et ses
sous classes)).
l'organisation interne de vector<> passe nécessairement par
des pointeurs de la classe template, n'imposer que des
références à l'insertion ne me parait pas si indispensable.
(ok, tu vas me répondre que je n'ai pas le droit de lire la
définition du template ou d'en tirer des conclusions).
si la question était ouverte ("si" parce que heureusement 99%
des utilisateurs se foutent de l'avis qui suit), le mérite de
vector<> est son mécanisme allocator customisable (justement
pour traiter les références) et son redimensionnement, dans un
second temps ses itérateurs.
les 2 premiers points garantissent de travailler avec des
références (T&), c'est comme cela que je travaille dès que
possible donc il ne s'agirait pas de "travailler avec des
pointeurs", surtout pas; par contre je ne trouverais pas
gênant de faire un push(new T(...)).
kanze wrote on 18/09/2006 19:12:ben parce que "cela créé un temporaire" !
C'est un peu la philosophie de base de C++. On a des
temporaires sur la pile, plutôt que seulement des objets
créés dynamiquement.
j'aime cette philosophie, la coexistence de variables statiques ET
dynamiques me va très bien également; non, je ne vois pas comment
efficacement sans passer.
c'est ici seulement l'interface de vector<> dont il est question.
- on peux vouloir la "classe vectorisée" non copiable.
On ne peut pas. C'est contre la philosophie de base. (En fait,
je vois mal comment ça serait implémentable.)
je suis également d'accord avec les exigences du contrat de
vector<>, je soulignais le trait pour indiquer qu'il a *IMHO*
un caractère négatif.
il reste toutefois des cas où on a bien affaire à des
instances qui doivent être non copiables (wrapper de resources
physiques par exemple, ou gestionnaire d'accès à une source
non multi-entrante, etc); de tels gestionnaires ne peuvent pas
être regroupés / utilisés via un vector<>.
- on peux, en effet, trouver étonnant le fait de transmettre
un truc ne servant qu'à être jeté (création tempo,
instantiation ptr, recopie, destruction; tout ça à la place
d'une simple affectation de pointeur ne parait pas très
vertueux).
Et quelle est l'alternative ? Crée tout dynamiquement, et ne
travailler qu'avec des pointeurs ?
une alternative simple serait de pouvoir transmettre un T* (et
même tout pointeur sur une classe assimilable à un T (T et ses
sous classes)).
l'organisation interne de vector<> passe nécessairement par
des pointeurs de la classe template, n'imposer que des
références à l'insertion ne me parait pas si indispensable.
(ok, tu vas me répondre que je n'ai pas le droit de lire la
définition du template ou d'en tirer des conclusions).
si la question était ouverte ("si" parce que heureusement 99%
des utilisateurs se foutent de l'avis qui suit), le mérite de
vector<> est son mécanisme allocator customisable (justement
pour traiter les références) et son redimensionnement, dans un
second temps ses itérateurs.
les 2 premiers points garantissent de travailler avec des
références (T&), c'est comme cela que je travaille dès que
possible donc il ne s'agirait pas de "travailler avec des
pointeurs", surtout pas; par contre je ne trouverais pas
gênant de faire un push(new T(...)).
Alain Gaillard wrote on 18/09/2006 19:39:(std::vector<>)
Comment ça, simple affectation de pointeur ?
parce que vector<> est resizable, il repose nécessairement sur un array
de pointeur sur la classe template. il ne s'agit pas d'hypothèses sur une
implémentation X ou Y de telle STL mais d'une nécessité.
Alain Gaillard wrote on 18/09/2006 19:39:
(std::vector<>)
Comment ça, simple affectation de pointeur ?
parce que vector<> est resizable, il repose nécessairement sur un array
de pointeur sur la classe template. il ne s'agit pas d'hypothèses sur une
implémentation X ou Y de telle STL mais d'une nécessité.
Alain Gaillard wrote on 18/09/2006 19:39:(std::vector<>)
Comment ça, simple affectation de pointeur ?
parce que vector<> est resizable, il repose nécessairement sur un array
de pointeur sur la classe template. il ne s'agit pas d'hypothèses sur une
implémentation X ou Y de telle STL mais d'une nécessité.
Alain Gaillard wrote on 18/09/2006 19:39:(std::vector<>)
Comment ça, simple affectation de pointeur ?
parce que vector<> est resizable, il repose nécessairement sur
un array de pointeur sur la classe template. il ne s'agit pas
d'hypothèses sur une implémentation X ou Y de telle STL mais
d'une nécessité.
dès lors le moyen d'insérer un nouvel item dans un vector<>
(pas de créer le vector initial avec une taille non nulle)
est:
- de recevoir une référence ou un temporaire (la différence
n'existant que dans le contexte de l'appelant) pour en
réaliser une copie dynamique et stocker cette copie.
ce qui me ""gène"" est le fait que cette interface résulte (un
peu) de choix non sémantiques et/ou rationnelles mais sur des
hypothèses sur le codeur distrait - soit, ils existent; soit
le langage peut aider à limiter la casse, ...
Alain Gaillard wrote on 18/09/2006 19:39:
(std::vector<>)
Comment ça, simple affectation de pointeur ?
parce que vector<> est resizable, il repose nécessairement sur
un array de pointeur sur la classe template. il ne s'agit pas
d'hypothèses sur une implémentation X ou Y de telle STL mais
d'une nécessité.
dès lors le moyen d'insérer un nouvel item dans un vector<>
(pas de créer le vector initial avec une taille non nulle)
est:
- de recevoir une référence ou un temporaire (la différence
n'existant que dans le contexte de l'appelant) pour en
réaliser une copie dynamique et stocker cette copie.
ce qui me ""gène"" est le fait que cette interface résulte (un
peu) de choix non sémantiques et/ou rationnelles mais sur des
hypothèses sur le codeur distrait - soit, ils existent; soit
le langage peut aider à limiter la casse, ...
Alain Gaillard wrote on 18/09/2006 19:39:(std::vector<>)
Comment ça, simple affectation de pointeur ?
parce que vector<> est resizable, il repose nécessairement sur
un array de pointeur sur la classe template. il ne s'agit pas
d'hypothèses sur une implémentation X ou Y de telle STL mais
d'une nécessité.
dès lors le moyen d'insérer un nouvel item dans un vector<>
(pas de créer le vector initial avec une taille non nulle)
est:
- de recevoir une référence ou un temporaire (la différence
n'existant que dans le contexte de l'appelant) pour en
réaliser une copie dynamique et stocker cette copie.
ce qui me ""gène"" est le fait que cette interface résulte (un
peu) de choix non sémantiques et/ou rationnelles mais sur des
hypothèses sur le codeur distrait - soit, ils existent; soit
le langage peut aider à limiter la casse, ...
Si tu as un problème de ce type, il me semble que c'est a
priori que tu ferais mieux d'éviter std::vector et
d'utiliser plutôt une std::list : tu sous-entends qu'il est
ici lourd et à éviter que de créer un temporaire pour copie.
Or le vecteur fait cela tout le temps dès que la taille
change, et le list permet de l'éviter.
Si on fait un resize avec une taille inférieure, il y a
réallocation, ou bien est-ce que cela garde la zone mémoire
actuelle?
Si tu as un problème de ce type, il me semble que c'est a
priori que tu ferais mieux d'éviter std::vector et
d'utiliser plutôt une std::list : tu sous-entends qu'il est
ici lourd et à éviter que de créer un temporaire pour copie.
Or le vecteur fait cela tout le temps dès que la taille
change, et le list permet de l'éviter.
Si on fait un resize avec une taille inférieure, il y a
réallocation, ou bien est-ce que cela garde la zone mémoire
actuelle?
Si tu as un problème de ce type, il me semble que c'est a
priori que tu ferais mieux d'éviter std::vector et
d'utiliser plutôt une std::list : tu sous-entends qu'il est
ici lourd et à éviter que de créer un temporaire pour copie.
Or le vecteur fait cela tout le temps dès que la taille
change, et le list permet de l'éviter.
Si on fait un resize avec une taille inférieure, il y a
réallocation, ou bien est-ce que cela garde la zone mémoire
actuelle?
JM wrote on 18/09/2006 23:01:Si on fait un resize avec une taille inférieure, il y a
réallocation, ou bien est-ce que cela garde la zone mémoire
actuelle?
cela peut dépendre de l'implémentation,
je pense que la réallocation n'est pas garantie:
le vector<> travaillant naturellement avec son concept
d'itérateur, il aura tendance à simplement ajuster ses bornes.
évidemment un resize(10% * size()) pose dès lors en problème
en l'absence d'une méthode pack() (compactant le vecteur a sa
seule taille nécessaire).
JM wrote on 18/09/2006 23:01:
Si on fait un resize avec une taille inférieure, il y a
réallocation, ou bien est-ce que cela garde la zone mémoire
actuelle?
cela peut dépendre de l'implémentation,
je pense que la réallocation n'est pas garantie:
le vector<> travaillant naturellement avec son concept
d'itérateur, il aura tendance à simplement ajuster ses bornes.
évidemment un resize(10% * size()) pose dès lors en problème
en l'absence d'une méthode pack() (compactant le vecteur a sa
seule taille nécessaire).
JM wrote on 18/09/2006 23:01:Si on fait un resize avec une taille inférieure, il y a
réallocation, ou bien est-ce que cela garde la zone mémoire
actuelle?
cela peut dépendre de l'implémentation,
je pense que la réallocation n'est pas garantie:
le vector<> travaillant naturellement avec son concept
d'itérateur, il aura tendance à simplement ajuster ses bornes.
évidemment un resize(10% * size()) pose dès lors en problème
en l'absence d'une méthode pack() (compactant le vecteur a sa
seule taille nécessaire).
j'aime cette philosophie, la coexistence de variables statiques ET
dynamiques me va très bien également; non, je ne vois pas comment
efficacement sans passer.
je suis également d'accord avec les exigences du contrat de vector<>, je
soulignais le trait pour indiquer qu'il a *IMHO* un caractère négatif.
il reste toutefois des cas où on a bien affaire à des instances qui
doivent être non copiables (wrapper de resources physiques par exemple,
ou gestionnaire d'accès à une source non multi-entrante, etc); de tels
gestionnaires ne peuvent pas être regroupés / utilisés via un vector<>.
une alternative simple serait de pouvoir transmettre un T* (et même tout
pointeur sur une classe assimilable à un T (T et ses sous classes)).
l'organisation interne de vector<> passe nécessairement par des
pointeurs de la classe template
si la question était ouverte ("si" parce que heureusement 99% des
utilisateurs se foutent de l'avis qui suit), le mérite de vector<> est
son mécanisme allocator customisable
(justement pour traiter les
références)
et son redimensionnement, dans un second temps ses itérateurs.
les 2 premiers points garantissent de travailler avec des références
(T&), c'est comme cela que je travaille dès que possible donc il ne
s'agirait pas de "travailler avec des pointeurs", surtout pas;
par
contre je ne trouverais pas gênant de faire un push(new T(...)).
j'aime cette philosophie, la coexistence de variables statiques ET
dynamiques me va très bien également; non, je ne vois pas comment
efficacement sans passer.
je suis également d'accord avec les exigences du contrat de vector<>, je
soulignais le trait pour indiquer qu'il a *IMHO* un caractère négatif.
il reste toutefois des cas où on a bien affaire à des instances qui
doivent être non copiables (wrapper de resources physiques par exemple,
ou gestionnaire d'accès à une source non multi-entrante, etc); de tels
gestionnaires ne peuvent pas être regroupés / utilisés via un vector<>.
une alternative simple serait de pouvoir transmettre un T* (et même tout
pointeur sur une classe assimilable à un T (T et ses sous classes)).
l'organisation interne de vector<> passe nécessairement par des
pointeurs de la classe template
si la question était ouverte ("si" parce que heureusement 99% des
utilisateurs se foutent de l'avis qui suit), le mérite de vector<> est
son mécanisme allocator customisable
(justement pour traiter les
références)
et son redimensionnement, dans un second temps ses itérateurs.
les 2 premiers points garantissent de travailler avec des références
(T&), c'est comme cela que je travaille dès que possible donc il ne
s'agirait pas de "travailler avec des pointeurs", surtout pas;
par
contre je ne trouverais pas gênant de faire un push(new T(...)).
j'aime cette philosophie, la coexistence de variables statiques ET
dynamiques me va très bien également; non, je ne vois pas comment
efficacement sans passer.
je suis également d'accord avec les exigences du contrat de vector<>, je
soulignais le trait pour indiquer qu'il a *IMHO* un caractère négatif.
il reste toutefois des cas où on a bien affaire à des instances qui
doivent être non copiables (wrapper de resources physiques par exemple,
ou gestionnaire d'accès à une source non multi-entrante, etc); de tels
gestionnaires ne peuvent pas être regroupés / utilisés via un vector<>.
une alternative simple serait de pouvoir transmettre un T* (et même tout
pointeur sur une classe assimilable à un T (T et ses sous classes)).
l'organisation interne de vector<> passe nécessairement par des
pointeurs de la classe template
si la question était ouverte ("si" parce que heureusement 99% des
utilisateurs se foutent de l'avis qui suit), le mérite de vector<> est
son mécanisme allocator customisable
(justement pour traiter les
références)
et son redimensionnement, dans un second temps ses itérateurs.
les 2 premiers points garantissent de travailler avec des références
(T&), c'est comme cela que je travaille dès que possible donc il ne
s'agirait pas de "travailler avec des pointeurs", surtout pas;
par
contre je ne trouverais pas gênant de faire un push(new T(...)).