2010-04-29 5 views
5

J'ai lu sur Internet que si vous effacez un std::vector répétitivement (dans une boucle serrée), il pourrait être préférable d'utiliser resize(0) au lieu de clear(), car il peut être plus rapide. Je ne suis pas certain de cela. Quelqu'un at-il une réponse définitive à cela?Vecteur effacer vs redimensionner

+1

Pouvez-vous essayer dans les deux sens et nous dire comment ça se passait? –

+0

supposons que vous voulez dire 'resize (0)'? – Roddy

Répondre

13

Je suppose que vous voulez dire resize(0) au lieu de setsize, et appelant qu'au lieu de clear(), et que vous parlez std::vector. IIRC une réponse récente discuté ce (ne peut pas trouver le lien), et sur les implémentations STL modernes, clear() est probablement identique à resize(0).

L'effacement préalable d'un vecteur peut libérer toute sa mémoire (sa capacité est également réduite à zéro), entraînant des réaffectations lorsque vous recommencez à ajouter des éléments, contrairement à resize(0) en conservant la capacité de sorte qu'il y ait moins de réaffectations. Cependant, je pense que dans les bibliothèques modernes de STL, il n'y a pas de différence. Si vous utilisez une ancienne implémentation STL, ou si vous êtes simplement parano, resize(0) pourrait être plus rapide.

+0

Ou en utilisant MFC, sa classe array (ie vector) a un setize qui est effectivement un redimensionnement –

+0

Je ne sais pas sur les conteneurs de MFC, le vecteur OP dit donc je supposais qu'ils signifient 'std :: vector '. – AshleysBrain

1

Cette implémentation sonore spécifique, est un travail pour vous, votre bibliothèque et un profileur. Mais comme je le vois, je ne vois pas pourquoi resize (0) devrait être plus rapide quand les deux vont en effet appeler erase (begin(), end()).

2

Regarder Dinkumware source STL, à la fois appeler efficacement erase(begin(), end());

clear() est un peu plus efficace, sans surprise., Comme il l'a juste un cas à traiter. mais je ne m'attendrais pas à ce que ce soit mesurable.

0

Il semble y avoir une différence entre clear et resize (0) lorsque le vecteur contient des objets d'une classe qui n'a pas de constructeur par défaut. Par exemple, le code suivant compilera:

#include <vector> 

class A { 
private: 
    int x,y; 
public: 
    A(int x,int y) :x(x), y(y) {} 
}; 

int main() { 
    std::vector <A> aa; 

    aa.clear(); 
} 

Mais si vous remplacez le aa.clear() par aa.resize(0), vous obtenez une erreur de compilation:

error: no matching function for call to 'A::A()' 
+0

Je suppose que c'est parce que le redimensionnement a besoin du constructeur par défaut afin qu'il puisse par défaut construire de nouveaux éléments si vous redimensionnez à une taille plus grande que la taille actuelle. –