Comment peut on utiliser les iterators des vectors, car je suis confronté un
petit problème :
Reserver une taille pour un vector ne met pas a jour les iterators begin()
et end() !
C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
#include <iostream>
#include <vector>
using namespace std;
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Christophe de VIENNE
Jeremie Fouche wrote:
Bonjour
Comment peut on utiliser les iterators des vectors, car je suis confronté un petit problème : Reserver une taille pour un vector ne met pas a jour les iterators begin() et end() ! C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
Attention, il ne faut pas confondre reserve et resize : reserve pré-alloue un espace mémoire, mais n'ajoute aucun élément, au contraire de resize. Quand à capacity, il donne la quantité de mémoire alloué, ou plus exactement la taille que peut atteindre le vecteur sans qu'une réallocation ne soit nécéssaire. A ne pas confondre avec size().
Le comportement mis en évidence dans ton exemple est tout à fait normal.
A+
Christophe
-- Christophe de Vienne
Jeremie Fouche wrote:
Bonjour
Comment peut on utiliser les iterators des vectors, car je suis confronté un
petit problème :
Reserver une taille pour un vector ne met pas a jour les iterators begin()
et end() !
C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
Attention, il ne faut pas confondre reserve et resize :
reserve pré-alloue un espace mémoire, mais n'ajoute aucun élément, au
contraire de resize.
Quand à capacity, il donne la quantité de mémoire alloué, ou plus
exactement la taille que peut atteindre le vecteur sans qu'une
réallocation ne soit nécéssaire. A ne pas confondre avec size().
Le comportement mis en évidence dans ton exemple est tout à fait normal.
Comment peut on utiliser les iterators des vectors, car je suis confronté un petit problème : Reserver une taille pour un vector ne met pas a jour les iterators begin() et end() ! C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
Attention, il ne faut pas confondre reserve et resize : reserve pré-alloue un espace mémoire, mais n'ajoute aucun élément, au contraire de resize. Quand à capacity, il donne la quantité de mémoire alloué, ou plus exactement la taille que peut atteindre le vecteur sans qu'une réallocation ne soit nécéssaire. A ne pas confondre avec size().
Le comportement mis en évidence dans ton exemple est tout à fait normal.
A+
Christophe
-- Christophe de Vienne
Luc Hermitte
Bonjour,
"Jeremie Fouche" wrote in news:cbrl1l$sdt$:
Comment peut on utiliser les iterators des vectors, car je suis confronté un petit problème : Reserver une taille pour un vector ne met pas a jour les iterators begin() et end() !
Si. Si la capacité du buffer interne était insuffisante, celui-ci et agrandi et tous les itérateurs précédemment issus du vecteur sont invalidés. Entre autres, begin() et end() sont modifiés -- ce qui ne les empêche pas d'être égaux.
C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
reserve() réserve de la mémoire qui sera utilisée par le vecteur par la suite. C'est de l'optimisation qui permet d'éviter de redimensionner trop souvent le buffer utilisé en interne. Convient bien à l'utilisation de push_back()
resize() redimensionne le vecteur. Pas vraiment "compatible" avec push_back(). Plutôt orienté pour les manipulations avec l'opérateur [].
-- Luc Hermitte <hermitte at free.fr> FAQ de <news:fr.comp.lang.c++> : <http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/> Dejanews : <http://groups.google.com/advanced_group_search>
Bonjour,
"Jeremie Fouche" <jeremie.fouche.tonmasque@tiscali.fr> wrote in
news:cbrl1l$sdt$1@news.tiscali.fr:
Comment peut on utiliser les iterators des vectors, car je suis
confronté un petit problème :
Reserver une taille pour un vector ne met pas a jour les iterators
begin() et end() !
Si. Si la capacité du buffer interne était insuffisante, celui-ci et
agrandi et tous les itérateurs précédemment issus du vecteur sont
invalidés. Entre autres, begin() et end() sont modifiés -- ce qui ne les
empêche pas d'être égaux.
C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
reserve() réserve de la mémoire qui sera utilisée par le vecteur par la
suite. C'est de l'optimisation qui permet d'éviter de redimensionner trop
souvent le buffer utilisé en interne. Convient bien à l'utilisation de
push_back()
resize() redimensionne le vecteur. Pas vraiment "compatible" avec
push_back(). Plutôt orienté pour les manipulations avec l'opérateur [].
--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>
Comment peut on utiliser les iterators des vectors, car je suis confronté un petit problème : Reserver une taille pour un vector ne met pas a jour les iterators begin() et end() !
Si. Si la capacité du buffer interne était insuffisante, celui-ci et agrandi et tous les itérateurs précédemment issus du vecteur sont invalidés. Entre autres, begin() et end() sont modifiés -- ce qui ne les empêche pas d'être égaux.
C'est dommage car j'allouai l'espace nécéssaire avec reserve()..
reserve() réserve de la mémoire qui sera utilisée par le vecteur par la suite. C'est de l'optimisation qui permet d'éviter de redimensionner trop souvent le buffer utilisé en interne. Convient bien à l'utilisation de push_back()
resize() redimensionne le vecteur. Pas vraiment "compatible" avec push_back(). Plutôt orienté pour les manipulations avec l'opérateur [].
-- Luc Hermitte <hermitte at free.fr> FAQ de <news:fr.comp.lang.c++> : <http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/> Dejanews : <http://groups.google.com/advanced_group_search>