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

liberer la reserve d'un std::vector après remplissage... - C++ - Programmation

Marsh Posté le 28-07-2005 à 15:47:17    

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
Reply

Marsh Posté le 28-07-2005 à 15:47:17   

Reply

Marsh Posté le 28-07-2005 à 16:58:48    

resize(n);
 
je pense!

Reply

Marsh Posté le 29-07-2005 à 04:08:47    

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

Reply

Marsh Posté le 29-07-2005 à 09:26:55    

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?

Reply

Marsh Posté le 29-07-2005 à 10:05:18    

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
Reply

Marsh Posté le 29-07-2005 à 15:43:13    

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.

Reply

Marsh Posté le 29-07-2005 à 15:50:49    

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
Reply

Marsh Posté le 29-07-2005 à 16:27:07    

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
Reply

Marsh Posté le 29-07-2005 à 19:46:11    

:whistle:  :whistle:


Message édité par el muchacho le 30-07-2005 à 08:02:29
Reply

Marsh Posté le 29-07-2005 à 23:32:38    

?

Reply

Marsh Posté le 29-07-2005 à 23:32:38   

Reply

Marsh Posté le 01-08-2005 à 15:06:18    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed