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

  FORUM HardWare.fr
  Programmation
  C++

  liberer la reserve d'un std::vector après remplissage...

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

liberer la reserve d'un std::vector après remplissage...

n°1163316
babthefox2​002
Posté le 28-07-2005 à 15:47:17  profilanswer
 

Bonjour,
 
je me pose une question à propos des std::vector : peut-t-on diminuer la taille de la réserve ?
 
Je m'explique, je veux par exemple créer un vecteur de taille inconnue mais quand même assez conséquente,  
du coup j'utilise une réserve pour pouvoir éviter un nombre de trop grand de réallocations.
Puis je remplis mon vecteur (avec moins d'éléments que la taille de la réserve), et ensuite j'aimerai  
pouvoir supprimer la réserve restante.
 
Peut être que cela se fait automatiquement mais je ne crois pas ?
 
Cela donnerai quelque chose comme celà :
 

Code :
  1. std::vector<int> remplirVecteur(const std::vector<int>& v) {
  2.     std::vector<int> vect;
  3.     vect.reserve(10000); // on reserve suffisament d'espace
  4.     // on remplit vect avec les valeurs de v
  5.     for(int i = 0; i < v.size(); i++)
  6.        vect.push_back(v[i]);
  7.     // Ce que j'aimerai faire : vect.reserve.clear(); // = vider la reserve !
  8.     cout << "vect size : " << vect.size() << ", cap = " << vect.capacity() << endl;
  9.     return vect;
  10. } // remplirVecteur


 
Ici bien entendu j'aurai pu utiliser la taille de v (v.size()) pour réserver la bonne taille mais cela est  
juste pour illustrer ce que j'essaye de faire, parce que lorsque je lis des valeurs dans un fichier ou une  
base de données je ne connais pas par avance leur nombre !
 
 
Merci pour vos réponses.
 
                      Nicolas


Message édité par babthefox2002 le 29-07-2005 à 15:46:36
mood
Publicité
Posté le 28-07-2005 à 15:47:17  profilanswer
 

n°1163586
Rits75
to?be:!be
Posté le 28-07-2005 à 16:58:48  profilanswer
 

resize(n);
 
je pense!

n°1164215
el muchach​o
Comfortably Numb
Posté le 29-07-2005 à 04:08:47  profilanswer
 

J'ai comme un gros doute sur cette réponse. :o

n°1164272
slash33
Posté le 29-07-2005 à 09:26:55  profilanswer
 

el muchacho a écrit :

J'ai comme un gros doute sur cette réponse. :o


+1. Au fait et si tu donnais la réponse?

n°1164323
HelloWorld
Salut tout le monde!
Posté le 29-07-2005 à 10:05:18  profilanswer
 

En supposant que ta fonction était un exemple, je crois que la méthode préconisée est:

Code :
  1. return std::vector<int>( vect.begin(), vect.end() );


Mais vu que c'est plus ou moins ce qui se passe dans ton cas car tu renvoie une copie, il faudrait tester le capacity() de vect avec le capacity() du vecteur renvoyé par remplirVecteur().


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1164930
babthefox2​002
Posté le 29-07-2005 à 15:43:13  profilanswer
 

Si je un main() comme cela :
 

Code :
  1. int main(int argc, char** argv) {
  2.   vector<int> v_ini;
  3.   v_ini.push_back(5);
  4.   v_ini.push_back(6);
  5.   v_ini.push_back(7);
  6.   v_ini.push_back(8);
  7.   cout << "v_ini size : " << v_ini.size()
  8.        << ", cap = " << v_ini.capacity() << endl;
  9.   vector<int> v_out;
  10.   v_out = remplirVecteur(v_ini);
  11.   cout << "v_out size : " << v_out.size()
  12.        << ", cap = " << v_out.capacity() << endl;
  13.  
  14. } // main


 
J'obtiens comme sortie :

Code :
  1. v_ini size : 4, cap = 4
  2. vect size : 4, cap = 10000
  3. v_out size : 4, cap = 4


 
Donc apparemment le compilo (g++-3.3 dans mon cas), redimensionne la taille du vecteur automatiquement à la sortie de la fonction.
La solution est donc de passer par une fonction.

n°1164950
el muchach​o
Comfortably Numb
Posté le 29-07-2005 à 15:50:49  profilanswer
 

slash33 a écrit :

+1. Au fait et si tu donnais la réponse?


Si mes souvenirs sont exacts, il n'y a pas moyen de réduire explicitement la taille réservée d'un vector (sauf à faire un delete et une recopie), la gestion est à la charge de l'implémentation du container vector. Donc en fonction de ce que l'on veut faire, il peut être plus intéressant d'utiliser deque à la place de vector.


Message édité par el muchacho le 29-07-2005 à 15:52:35
n°1165013
HelloWorld
Salut tout le monde!
Posté le 29-07-2005 à 16:27:07  profilanswer
 

babthefox2002 a écrit :


Donc apparemment le compilo (g++-3.3 dans mon cas), redimensionne la taille du vecteur automatiquement à la sortie de la fonction.
La solution est donc de passer par une fonction.


Non, il redimensionne pas. Tu récupères un copie du vect renvoyé et non pas directement vect. C'est cette copie qui s'auto-dimensionne correctement.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1165221
el muchach​o
Comfortably Numb
Posté le 29-07-2005 à 19:46:11  profilanswer
 

:whistle:  :whistle:


Message édité par el muchacho le 30-07-2005 à 08:02:29
n°1165317
Taz
bisounours-codeur
Posté le 29-07-2005 à 23:32:38  profilanswer
 

?

mood
Publicité
Posté le 29-07-2005 à 23:32:38  profilanswer
 

n°1166835
HelloWorld
Salut tout le monde!
Posté le 01-08-2005 à 15:06:18  profilanswer
 

Code :
  1. std::vector<int> remplirVecteur()
  2. {
  3.     std::vector<int> vect;
  4.     return vect;
  5. }
  6. std::vector<int> v_out;
  7. v_out = remplirVecteur();


v_out est une copie de vect, ça revient à avoir:

Code :
  1. std::vector<int> vect;
  2. std::vector<int> v_out( vect );


soit  

Code :
  1. std::vector<int> vect;
  2. std::vector<int> v_out( vect.begin(), vect.end() );


ce qui fait que v_out est correctement dimensionné, indépendamment de la taille / capacité de vect.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite

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

  liberer la reserve d'un std::vector après remplissage...

 

Sujets relatifs
[C++] STL Vector : Suppression d'un ième élément[C++] Priority_queue/Vector
Récupérer l'heure du système avec un std::vector<int>Select multiple et remplissage d'une zone de texte [resolu tout seul]
Creer une barre de remplissageDébutant: vector non reconnu
[JAVA]Afficher un vector dans un Jtableproblème de remplissage d'une datagrid
STL - map pair vector - documentation ?[SQL]Concaténer 2 chaînes numériques avec espace reservé
Plus de sujets relatifs à : liberer la reserve d'un std::vector après remplissage...


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