Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1676 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  remplissage d'un vector - perfs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

remplissage d'un vector - perfs

n°1970798
snafu8
Posté le 03-03-2010 à 11:01:22  profilanswer
 

Salut à tous,  
 
je cherche à vider puis remplir un vector, et j'hésite entre ces méthodes :  
 

Code :
  1. //methode 1
  2. std::vector<Objet> toto.clear();
  3. toto.resize(N);
  4. for(int i = 0 ; i < N ; ++i)
  5. toto[i] = valeur;
  6. //methode 2
  7. toto.clear();
  8. for(int i = 0 ; i <N ; ++i)
  9. toto.push_back(valeur);
  10. //methode 3
  11. toto.resize(N);
  12. for(int i = 0 ; i <N ; ++i)
  13. toto[i] = valeur;


 
Quelles vont être les différences en termes de comportement et en termes de perfs entre ces trois méthodes? Est-ce que ça dépend de la classe Objet, du nombre de bitogniots que je mets dans le vecteur?

mood
Publicité
Posté le 03-03-2010 à 11:01:22  profilanswer
 

n°1970840
Joel F
Real men use unique_ptr
Posté le 03-03-2010 à 13:24:46  profilanswer
 
n°1970841
Un Program​meur
Posté le 03-03-2010 à 13:28:04  profilanswer
 

A adapter parce qu'il connait ce avec quoi il veut reinitialiser.  Donc:
 

Code :
  1. std::vector<Object>(N, valeur).swap (toto);


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1970842
Joel F
Real men use unique_ptr
Posté le 03-03-2010 à 13:29:22  profilanswer
 

oui ofc :jap:

n°1970863
theshockwa​ve
I work at a firm named Koslow
Posté le 03-03-2010 à 14:46:06  profilanswer
 

lorsque c'est pour remplir le tableau une première fois et avec des données arbitraires, plutôt que de faire un resize puis des accès directs aux données, j'aurais tendance à préférer faire un reserve puis des push_back.
Après, pour initialiser N éléments à la même valeur quand on part d'un tableau avec une taille différente, effectivement, le swap ne fait pas trop de doute.
 
Si les objets que tu manipules ont des effets de bord à la construction et destruction, fais bien attention parce que tu vas obtenir des comportements très différents suivant la solution employée.


---------------
last.fm
n°1970884
bjone
Insert booze to continue
Posté le 03-03-2010 à 15:59:50  profilanswer
 

Un Programmeur a écrit :

A adapter parce qu'il connait ce avec quoi il veut reinitialiser.  Donc:
 

Code :
  1. std::vector<Object>(N, valeur).swap (toto);



 
Tu te retrouve avec un pic d'allocation mémoire qui cumule l'ancien et le nouveau vector.
Si c'est pas problématique ça va, après si c'est un bon gros vector bien lourd de plusieurs dizaines, centaines de Mo, (genre une image, un buffer audio, ou moultes échantillons divers ou autres trucs), c'est pas forcément glop. (donc le swap avec un truc vide, puis un resize)
 
Après dans certains cas, chercher a ramener absolument la capacité au nombres d'éléments c'est pas forcément une bonne idée: par exemple dans le cas d'une queue d'éléments a traiter, souvent avec le même nombre d'éléments pour une question de cohérence temporelle et/ou spatiale (les objets en vue dans un moteur 3d: d'une frame à l'autre le nombre d'éléments sera très fréquemment le même).

n°1970956
Joel F
Real men use unique_ptr
Posté le 03-03-2010 à 19:16:49  profilanswer
 

sauf que les compilso vont très certainement faire des elisions sur les allcoations et les copies (cf article de abrahams sur le sujet).
 
swap est devenu tres tres interessant de nos jours.

n°1971868
snafu8
Posté le 08-03-2010 à 10:17:33  profilanswer
 

Est-ce que pour faire ça je dois définir Objet::swap() ? Et si oui, à quoi je dois prendre garde quand je le fait?

n°1971881
Joel F
Real men use unique_ptr
Posté le 08-03-2010 à 11:07:23  profilanswer
 

oui, il vaut mieux. Le plus simple est de l'ecrire en utilisant std::swap (ou boost::swap)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  remplissage d'un vector - perfs

 

Sujets relatifs
Vector et pointeurvector iterators incompatible
push_back(new maClasse) dans un vector de vectorremplissage de plusieurs fichiers XML depuis un fichier XLS
[Crypto] TripleDES - Initialization vectorAccess remplissage table intermédaire dans formulaire
vector et thread safe[SQL SERVER 2005] Script de remplissage de table (BLUK INSERT & cie)
Algo de remplissage d'une boitevector libération mémoire
Plus de sujets relatifs à : remplissage d'un vector - perfs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR