Correction du vecteur Oofelie. Le “mtMath::Vector” ne se comportait pas comme un “std::vector” au moment du resize ce qui était un peu contre-intuitif…
Pour un std::vector, lorsqu'on resize un std::vector de taille n à une taille m<n, les m premiers éléments sont conservés et les (n-m) suivants sont désalloués. Si la nouvelle taille est supérieure, le std::vector est agrandi en mettant autant de copies que nécessaire d'une valeur donnée par l'utilisateur à la fin du std::vector.
Pour le vecteur Oofelie, les données n'était “normalement” pas conservées. Le fonctionnement était le suivant : - On désalloue le vecteur - On en réalloue un nouveau.
Si l'espace alloué est le même que l'espace désalloué et que l'on cherche à accéder aux valeurs précédement connues (avant le resize), on peut donc les récupérer. Si l'espace n'est pas le même, on peut récupérer à peu près tout et n'importe quoi, ce qui bien-sûr n'est pas trop souhaitable.
J'ai changé la fonction resize pour qu'elle se comporte de manière équivalente à un std::vector. La seule différence est que si la nouvelle taille est supérieure, on alloue des 0 en fin de mtMath::Vector (on pourrait mettre un argument par défaut comme pour le std, mais pas sur que ce soit utile, surtout qu'ici on sait qu'on a que des valeurs numériques).
Le comportement est donc le suivant :
mtMath::Vector Fint ; for(int i = 1 ; i < 9 ; i ++) Fint(i) = (double) i ; Fint.write(std::cout); Fint.resize(3); Fint.write(std::cout); Fint.resize(5); Fint.write(std::cout);
Donnera en sortie :
Fint = [1 2 3 4 5 6 7 8] Fint = [1 2 3] Fint = [1 2 3 0 0]