[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
Bonjour,

voila, j'ai besoin de votre aide conecrnant push_back(),
#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
    std::vector<int> v(4);
    cout<<"Nombre d'element dans le tableau : "<<v.size()<<endl;
    v[0]=2;
    v[1]=44;
    v[2]=23;
    cout<<"L'element N°2 est : "<<v[1]<<endl;
    v.push_back(11); // affecter la valeur 11 à la fin du vecteur
    cout<<"Le dernier element est : "<<v[3]<<endl; // cela m'affiche 0 et pas 11
    system("PAUSE");
    return EXIT_SUCCESS;
}


merci
A voir également:

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
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 :
#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
0
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
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 :
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 !
-1