[c++] vector
Résolu/Fermé
jacinthe87
Messages postés
194
Date d'inscription
mercredi 4 février 2009
Statut
Membre
Dernière intervention
15 juillet 2010
-
31 mai 2009 à 20:39
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 - 1 juin 2009 à 02:41
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 - 1 juin 2009 à 02:41
A voir également:
- Vector c++
- AlgoLab Photo Vector - Télécharger - Retouche d'image
2 réponses
mamiemando
Messages postés
33401
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 novembre 2024
7 804
1 juin 2009 à 02:41
1 juin 2009 à 02:41
Si elle peut mettre les deux ça ne gêne pas. Au début je te conseille d'éviter les using namespace c'est pas une très bonne habitude et c'est à proscrire dans un header.
Pour l'histoire du std::vector KX a vu juste : à la construction tu crées un vector de 4 cases (qui appelle 4 fois le "constructeur" par défaut et donc met 4 zéros -note que pour un type de base tout se passe "comme si" il y avait un constructeur). Ensuite tu modifies les 3 premières cases donc la 4e vaut toujours 0. En effet :
donne à l'exécution :
Lorsque tu fais un push_back, tu rajoutes un 5 élément (en v[4] donc) avec une valeur de 11. Note qu'un push_back devrait être évité dans ce cas particulier car tu es capable de dimensionner ton vecteur. En effet un std::vector alloue une plage mémoire contiguë, un peu comme les "tableaux" en C. Cela signifie que si tu l'étends et que la mémoire est déjà occupée à cet endroit, la STL est obligée de réallouer tout le vecteur à un autre endroit de la mémoire ce qui est coûteux en termes de performances (surtout si le vector est grand).
Ici, tu sais que ton vector contiendra 5 éléments, donc autant l'allouer comme tel (soit à la construction, soit avec la méthode reserve).
Note que la STL propose une méthode resize et une méthode reserve. La première redimensionne le vecteur et réserve donc la mémoire requise, la seconde réserve la mémoire mais la taille du vector n'est pas modifiée. Il est dès lors possible avec un reserve d'éviter des réallocations.
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
Je t'invite également à jeter un œil ici :
http://www.commentcamarche.net/faq/sujet 11255 introduction a la stl en c standard template library
Bonne chance
Pour l'histoire du std::vector KX a vu juste : à la construction tu crées un vector de 4 cases (qui appelle 4 fois le "constructeur" par défaut et donc met 4 zéros -note que pour un type de base tout se passe "comme si" il y avait un constructeur). Ensuite tu modifies les 3 premières cases donc la 4e vaut toujours 0. En effet :
#include <iostream> #include <vector> int main() { std::vector<int> v(4); std::cout << "Nombre d'element dans le tableau : " << v.size() << std::endl; v[0] = 2; v[1] = 44; v[2] = 23; std::cout << "L'element N°2 est : " << v[1] << std::endl; v.push_back(11); for(std::size_t i=0;i<v.size();++i) std::cout << v[i] << std::endl; std::cout << "Le dernier element est : " << v[v.size()-1] << std::endl; return 0; }
donne à l'exécution :
Nombre d'element dans le tableau : 4 L'element N°2 est : 44 2 44 23 0 11 Le dernier element est : 11
Lorsque tu fais un push_back, tu rajoutes un 5 élément (en v[4] donc) avec une valeur de 11. Note qu'un push_back devrait être évité dans ce cas particulier car tu es capable de dimensionner ton vecteur. En effet un std::vector alloue une plage mémoire contiguë, un peu comme les "tableaux" en C. Cela signifie que si tu l'étends et que la mémoire est déjà occupée à cet endroit, la STL est obligée de réallouer tout le vecteur à un autre endroit de la mémoire ce qui est coûteux en termes de performances (surtout si le vector est grand).
Ici, tu sais que ton vector contiendra 5 éléments, donc autant l'allouer comme tel (soit à la construction, soit avec la méthode reserve).
Note que la STL propose une méthode resize et une méthode reserve. La première redimensionne le vecteur et réserve donc la mémoire requise, la seconde réserve la mémoire mais la taille du vector n'est pas modifiée. Il est dès lors possible avec un reserve d'éviter des réallocations.
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
Je t'invite également à jeter un œil ici :
http://www.commentcamarche.net/faq/sujet 11255 introduction a la stl en c standard template library
Bonne chance
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
1 juin 2009 à 02:20
1 juin 2009 à 02:20
En fait push_back rajoute un élément à la fin
C'est à dire que v.size est incrémenté
Donc si tu cherches ton 11, il se trouve en v[4] et non en v[3]
Une façon simple de le vérifier est :
Mais ici, soit tu met namespace std, soit tu mets std:: mais pas les 2 !
C'est à dire que v.size est incrémenté
Donc si tu cherches ton 11, il se trouve en v[4] et non en v[3]
Une façon simple de le vérifier est :
cout << "taille avant : "<< v.size << endl; v.push_back(11); cout << "taille apres : "<< v.size << endl; cout << "dernier element : " << v[v.size-1] << endl; // oh un 11 ;)PS. je sais que t'as eu des problèmes avec les namespaces cet aprèm
Mais ici, soit tu met namespace std, soit tu mets std:: mais pas les 2 !