Comment se fait-suppression aléatoire d'un std :: vecteur est plus rapide qu'une std :: liste?

StackOverflow https://stackoverflow.com/questions/865666

Question

Comment se fait que la suppression aléatoire d'un std :: vecteur est plus rapide qu'une std :: liste? Ce que je fais pour l'accélérer est la permutation de l'élément aléatoire avec la dernière et la suppression du dernier. J'aurais pensé que la liste serait plus rapide puisque la suppression aléatoire est ce qu'il a été construit pour.

for(int i = 500; i < 600; i++){
    swap(vector1[i], vector1[vector1.size()-1]);
    vector1.pop_back();
}

for(int i = 0; i < 100; i++){
        list1.pop_front();
}

Résultats (en quelques secondes):
échange Vec supprimer: 0.00000909461232367903
Liste normale supprimer: 0,00011785102105932310

Était-ce utile?

La solution

Ce que vous faites est pas la suppression aléatoire cependant. Vous supprimez de la fin, qui est ce que les vecteurs sont construits pour (entre autres).

Et quand la permutation, vous faites une seule opération d'indexation aléatoire, qui est aussi quels vecteurs sont bons.

Autres conseils

La différence entre et std::list est non seulement std::vector vers le bas à la performance. Ils ont aussi une sémantique différente iterator d'invalidation. Si vous supprimez un élément d'une <=>, tous les itérateurs pointant vers d'autres éléments de la liste restent valables. Pas aussi avec <=>, l'effacement d'un élément annule tous itérateurs pointage après cet élément. (Dans certaines implémentations, ils peuvent encore servir itérateurs valable, mais selon la norme, ils sont désormais inutilisables, et une mise en œuvre la vérification doit affirmer si vous essayez de les utiliser.)

Donc, votre choix de conteneurs est également à voir avec ce que la sémantique dont vous avez besoin.

Ce n'est pas au hasard. Essayez vector1.erase (vector.begin () + rand ()% vector.size ()); à la place.

La liste va faire erase supprimer l'élément de la liste effacée, cela invoquera un appel à l'opérateur delete. L'effacement de vecteur provoque juste un échange et un décrément entier -. C'est beaucoup plus rapide

En fait, si vous voulez en vitesse-ups vous devriez éléments d'index dans le vecteur via itérateurs . Ils sont connus pour avoir de meilleures performances pour certaines architectures.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top