OVH Cloud OVH Cloud

vector et iterator

2 réponses
Avatar
Jeremie Fouche
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()..

#include <iostream>
#include <vector>
using namespace std;

typedef vector<int> vectInt;

int main(void)
{
vectInt v;
v.reserve(10);
cout << "capacity : " << v.capacity() << endl;
if (v.begin() == v.end())
{
cout << "begin == end !" << endl;
}
else
{
cout << "begin != end !" << endl;
}
return 0;
}

Merci pour vos réponses

--
Jérémie

2 réponses

Avatar
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

Avatar
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>