[STL] clear vs resize(0)
Le
Amerio
Bonjour,
La fonction clear() d'un std::vector "vide" le conteneur (mise a 0 de la
taille, et destruction des elements contenus).
Mais sur PC (VS 2003), clear() désalloue egalement toute la place réservé
par le vector (si j'avais fais un reserve(100) avant, alors apres le clear
c'est retombé a 0).
Si je remplace clear() par resize(0), alors la mémoire reservée n'est pas
perdue.
Questions :
- le comportement de clear() est il normalisé (vis a vis de reserve() ) ?
- peut il y a voir une impémenattion ou resize(0) fait _exactement_ comme
clear() ?
- y a t il une methode "standard" pour vider un conteneur, sans perdre
l'effet de "reserve()" ?
Merci !
La fonction clear() d'un std::vector "vide" le conteneur (mise a 0 de la
taille, et destruction des elements contenus).
Mais sur PC (VS 2003), clear() désalloue egalement toute la place réservé
par le vector (si j'avais fais un reserve(100) avant, alors apres le clear
c'est retombé a 0).
Si je remplace clear() par resize(0), alors la mémoire reservée n'est pas
perdue.
Questions :
- le comportement de clear() est il normalisé (vis a vis de reserve() ) ?
- peut il y a voir une impémenattion ou resize(0) fait _exactement_ comme
clear() ?
- y a t il une methode "standard" pour vider un conteneur, sans perdre
l'effet de "reserve()" ?
Merci !

Poser une question

Oui.
Je ne suis pas certain de comprendre la question. Tout ce que j'ai
trouvé su `clear()' est
Table 67, 23.1.1/4 :
expression | return type | assertion/note
| | pre/post-condition
-------------+--------------+-----------------------
a.clear() | void | erase(begin(), end())
| | post: size() == 0
-------------+--------------+-----------------------
23.2.4.2/6 :
void resize(size_type sz, T c = T());
Effects:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
;
Dans le cas de « resize( 0 ) », il s'agit donc bien du même
comportement. La seule différence éventuelle à trait à `size()'. Je
n'ai en effet pas trouvé dans la norme l'effet de `erase()' sur
celle-ci. Si cet effet est nul, ce que je pense, la post-condition de
`clear()' « size() == 0 » est un effet supplémentaire à « resize( 0 ) ».
D'après ce qui précède, il semblerait que ce que tu veux est
« x.resize( 0 ) » ou son équivalent « x.erase( x.begin() , x.end() ) ».
Détails à confirmer ou infirmer.
--drkm
D'après ma lecture de la norme, ce comportement n'est pas légal (ce que
j'ai lu se trouve dans une note. Est-ce normatif, et sinon où se trouve
ce genre d'info ?).
23.2.4.2 vector capacity
[...]
5 Notes: Reallocation invalidates all the references, pointers, and
iterators referring to the elements in the sequence. It is guaranteed
that no reallocation takes place during insertions that happen after a
call to reserve() until the time when an insertion would make the size
of the vector greater than the size specified in the most recent call to
reserve().
--
Loïc
Uh ? clear() implique size() == 0.
--
Franck Branjonneau
Oops. Je me suis emmêlé les size() et capacity().
--drkm
Si je comprend bien ce passage, il garantit que la capacité ne
baisse jamais (sauf éventuellement par un appel explicite à resize) ?
--drkm