IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

supprimer valeurs dans vector


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut supprimer valeurs dans vector
    Bonjour, en executant mon code ci dessous, une erreur m'apparait :
    Expression: Vector suscrit out of range ( Le but etant de supprimer les nombres paires dans le second tableau, en utilisant vector et erase )
    Je ne comprend pas cette erreur, et solicite de l'aide merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
    #include <conio.h>
    #include <vector>
     
    using namespace std;
     
    void main()
    {
    	const int nMax = 20;
    	vector<int> tab(20);
    	for (int a = 0; a < nMax; a++)
    	{
    		tab[a] = rand() % 101;
    	}
    	cout << "Voici le tableau de 20 entiers donne aleatoirement." << endl;
    	for (int a = 0; a < nMax; a++)
    	{
    		cout<<" | "<< tab[a];
    	}
    	cout << "\n\nVoici le tableau sans les nombres paires :" << endl;
    	for (int a = 0; a < nMax; a++)
    	{
    		if (tab[a]%2==0)
    		{
    			tab.erase(tab.begin());
    		}
    		else
    		{
    			cout << " | " << tab[a];
    		}
    	}
    	_getch();
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu parcours ton tableau sur 20 cases, et en chemin tu supprimes des cases.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut
    Je comprend, cependant quand je le diminue s'est automatiquement la derniere valeur qui est supprimée,
    pouvez vous m'indiquez comment faire?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    Lisez la documentation.
    http://www.cplusplus.com/reference/vector/vector/erase/

    Ligne 25, vous êtes sûr d'avoir supprimé le bon élément ???

    Après être passé une fois en ligne 25, la taille du tableau est de 19.
    Pensez-vous qu'après cela les bornes de la boucle en ligne 21 sont pertinentes ?

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Le mieux c'est de prendre le réflexe d'utiliser la bibliothèque standard, en particulier les algorithmes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <algorithm>
    #include <vector>
     
    int main() {
     
      std::vector<int> v = { 0, 1, 2, 3, 4, 5 };
      v.erase( std::remove_if(v.begin(), v.end(), [](int x) { return x % 2 != 0; }) , v.end() );
     
    }
    std::remove_if(b, e, p) repousse tous les éléments qui satisfont à p au bout du conteneur et renvoie un itérateur qui pointe après le dernier élément pour lequel p est faux.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut
    Merci pour vos reponses,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <iostream>
    #include <conio.h>
    #include <vector>
    #include <algorithm>
     
    using namespace std;
     
    void main()
    {
    	int nMax = 20;
    	vector<int> tab(nMax);
    	for (int a = 0; a < nMax; a++)
    	{
    		tab[a] = rand() % 101;
    	}
    	cout << "Voici le tableau de 20 entiers donne aleatoirement." << endl;
    	for (int a = 0; a < nMax; a++)
    	{
    		cout<<" | "<< tab[a];
    	}
    	cout << "\n\nVoici le tableau sans les nombres paires :" << endl;
    	for (int a = 0; a < nMax; a++)
    	{
    		tab.erase(remove_if(tab.begin(), tab.end(), [](int x){ return x % 2 == 0; }), tab.end());
    		nMax = nMax - 1;
    			cout << " | " << tab[a];
    	}
    	_getch();
    }
    Avec ce code, le but de l'exercice est réalisé, cependant j'ai un dernier probleme, ici ma derniere valeur aleatoire était 83, il devrait donc apparaitre
    à la fin, mais il n'y ai pas. Sinon pour les autres valeurs impairs ton astuce marche Merci

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut
    proleme resolu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
    #include <conio.h>
    #include <vector>
    #include <algorithm>
     
    using namespace std;
     
    void main()
    {
    	vector<int> tab(20);
    	for (int a = 0; a < 20; a++)
    	{
    		tab[a] = rand() % 101;
    	}
    	cout << "Voici le tableau de 20 entiers donne aleatoirement." << endl;
    	for (int a = 0; a < tab.size(); a++)
    	{
    		cout<<" | "<< tab[a];
    	}
    	cout << "\n\nVoici le tableau sans les nombres paires :" << endl;
    	for (int a = 0; a < tab.size(); a++)
    	{
    		tab.erase(remove_if(tab.begin(), tab.end(), [](int x){ return x % 2 == 0; }), tab.end()); //supprime tout les nombres paires
    	    cout << " | " << tab[a];
    	}
    	_getch();
    }
    Merci de votre aide

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut

    Belle exemple de "j'applique en copiant ce que j'ai trouvé sur internet sans comprendre".
    Sinon en lisant la doc de vector::erase tu devrais pouvoir écrire une boucle qui supprime les éléments, puisqu'il te retourne l'élément suivant après suppression.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut
    Pour la taille du tableau je l'ai réglé par moi même, puis j'ai compris ce qu'elle m'a ecrit,
    et je pense maintenant que ce que j'avais pré-écrit pouvait marché si j'avais juste changé mon probleme de taille,
    Je viens demandé de l'aide, pas du clash Bousk..

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    L'aide elle t'a été fournie dès le 3° post avec le lien vers la doc de vector::erase, que tu n'as peut-être toujours pas lu.
    Pas plus que celle de std::remove_if il semblerait.
    Citation Envoyé par Sylargh Voir le message
    Pour la taille du tableau je l'ai réglé par moi même, puis j'ai compris ce qu'elle m'a ecrit,
    et je pense maintenant que ce que j'avais pré-écrit pouvait marché si j'avais juste changé mon probleme de taille,
    Ton "problème" n'est pas la taille du tableau, mais que tu copies le code sans le comprendre.
    Pour avoir enseigné à plusieurs reprises, je sais repérer les étudiants qui se contentent de copier/coller un code sans le comprendre : le code fait grosso-merdo ce qu'il faut, le résultat est (souvent) bon, mais il fait n'importe quoi, n'importe comment.
    Et c'est exactement ce que dit ton code quand je le vois.

    Petit exercice, qu'on réalise généralement en apprenant l'algorithmie : la traduction en français de ce que notre code fait..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int a = 0; a < tab.size(); a++)
    	{
    		tab.erase(remove_if(tab.begin(), tab.end(), [](int x){ return x % 2 == 0; }), tab.end()); //supprime tout les nombres paires
    	    cout << " | " << tab[a];
    	}
    - tant que a, qui commence à 0, est plus petit que la taille du tableau
    - supprimer tous les éléments pairs du tableau
    - afficher l'élément à l'index a
    C'est toujours pas clair ?! C'est du recopiage flagrant sans comprendre...
    le remove_if, comme indiqué dans la doc et par stendhal, modifie le tableau, en déplaçant tous les éléments qui vérifient le prédicat, à la fin du vector, puis retourne l'itérateur vers le premier élément qui vérifie ce prédicat, le début de la liste de ceux qui le vérifient en fait, qui suit directement la liste de ceux qui ne le vérifient pas. Le tout dans le même tableau.
    En gros, ton tableau [1,2,3,4,5] va devenir [1,3,5,2,4] et retournera un itérateur vers le 2 (4° élément).
    C'est indigeste, mais c'est ce que ça fait. Puis on utilise erase (enfin une de ses 2 formes) pour supprimer ces éléments.
    C'est exactement ce qui est décrit et détaillé sur la doc de remove_if http://www.cplusplus.com/reference/algorithm/remove_if/
    Mais pour ça, il va falloir lire un peu de doc..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    C'est dommage, il aurait mis la ligne 3 avant la ligne 1, t'aurais rien vu @Bousk.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Probleme Insert svp
    Par chanteur06 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/10/2014, 16h19
  2. Ou est le probleme ici svp
    Par narpu dans le forum Débuter
    Réponses: 3
    Dernier message: 26/04/2011, 11h45
  3. Probleme requete svp
    Par swiixz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/06/2007, 19h43
  4. probleme Jinternalframe svp
    Par swiixz dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 30/05/2007, 18h38
  5. probleme projet svp
    Par ruspy dans le forum C++
    Réponses: 3
    Dernier message: 20/04/2006, 08h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo