GNT sans publicité, site mobile, fonctionnalitées exclusives...

[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 !
Lire les 11 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
darkman_spam
Le #769517
"Amerio"
- le comportement de clear() est il normalisé


Oui.

(vis a vis de reserve() ) ?


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

- peut il y a voir une impémenattion ou resize(0) fait _exactement_ comme
clear() ?


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 ) ».

- y a t il une methode "standard" pour vider un conteneur, sans perdre
l'effet de "reserve()" ?


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

Loïc Joly
Le #777147
Amerio wrote:

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).



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

Franck Branjonneau
Le #777141
(drkm) écrivait:

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
) ».


Uh ? clear() implique size() == 0.
--
Franck Branjonneau
darkman_spam
Le #772202
Franck Branjonneau
drkm écrivait:

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
) ».


Uh ? clear() implique size() == 0.


Oops. Je me suis emmêlé les size() et capacity().

--drkm


drkm
Le #772201
Loïc Joly
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().


Si je comprend bien ce passage, il garantit que la capacité ne
baisse jamais (sauf éventuellement par un appel explicite à resize) ?

--drkm

Publicité
Suivre les réponses
Poster une réponse
Anonyme