Bonjour,

Je suis confronté à quelque chose de surprenant avec le conteneur vector, et j'aurais besoin de l'avis d'experts es STL.

J'étais confronté à des temps d'exécution prohibitifs, et après vérification sur un cas simple (ci-dessous), j'ai pu vérifier ce que je subodorai : l'opérateur d'affectation ne copie pas la capacité du vecteur.

Exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
vector <int> a;
a.reserve(100);
cout << "capacity a = " << a.capacity() << endl;
 
vector <int> b;
b = a;
cout << "capacity b = " << b.capacity() << endl;
Affiche bien 100 pour a, mais 0 pour b !

Or, en toute logique, un opérateur d'affectation doit rendre identique les deux membres à gauche et à droite ! La STL serait-elle prise en défaut ? Ou est-ce l'implémentation que j'utilise qui a un problème (Mingw via DevCpp)? Ou alors quelque chose m'a échappé ?

Ca me pose un problème parce que je travaille avec des "listes de listes", implémentées sous la forme d'une classe "wrapper", qui enliste (via le conteneur "vector") des objets qui sont eux-mêmes des listes d'un objet. L'idée est d'éviter un tableau à deux dimensions, en améliorant les performances (du moins, c'est ce que je croyais naivement...)
De plus, mes listes primaires n'ont pas toutes le même nombre d'éléments.

Quand je crée ma liste de listes, j'ajoute ("push_back()") des objets de type liste, que j'ai préalablement dimensionné via "reserve()". Et quand ensuite je viens extraire ces listes pour y ajouter un élément, la capacité est de 0 au début ! Et le redimensionnement se faisant de façon automatique quand j'ajoute des élement et par puissance de deux (1,2,4,8, ...), ça me multiplie les recopie des objets enlistés, ralentissant considerablement le truc.

Pour l'instant, j'ai résolu le problème en ajoutant systématiquement lors de l'extraction d'une liste primaire un "reserve()" avec la valeur kivabien avant d'ajouter des élements, mais ça ne me plait pas trop. Je me demande si je ne vais pas laisser tomber le vector et me faire un bête tableau 2d "C-style", vu que le temps d'exécution est critique.

Sur le fond, ce comportement est-il normal ?

Merci pour vos avis.