Vectors C++ : éffacer une case
Résolu
azerty0
Messages postés
1274
Date d'inscription
Statut
Membre
Dernière intervention
-
Ploup -
Ploup -
Bonjour à tous.
Je souhaite réaliser un programme qui trouve les nombres chanceux avant un certain N donné. Pour cela, jutilise un vector, et il semble y avoir un problème de compil à un certain niveau, que je narrive pas a résoudre.
But de linstruction : Effacer la case i dun vector lorsque que i est paire :
Création du Vector dans le main : vector <bool> V(50);
Passage en paramètre dans ma fonction : int nombre_chanceux(vector <bool> V)
Instruction qui bloque dans la fonction : for(int i=2;i<V.size();i++) if(i%2==0) V.remove(i);
Ma commande V.remove doit désallouer V[i], mais a prirori, il y a un soucis...
Merci davance.
Azerty
Je souhaite réaliser un programme qui trouve les nombres chanceux avant un certain N donné. Pour cela, jutilise un vector, et il semble y avoir un problème de compil à un certain niveau, que je narrive pas a résoudre.
But de linstruction : Effacer la case i dun vector lorsque que i est paire :
Création du Vector dans le main : vector <bool> V(50);
Passage en paramètre dans ma fonction : int nombre_chanceux(vector <bool> V)
Instruction qui bloque dans la fonction : for(int i=2;i<V.size();i++) if(i%2==0) V.remove(i);
Ma commande V.remove doit désallouer V[i], mais a prirori, il y a un soucis...
Merci davance.
Azerty
24 réponses
Voila, j'ai demandé à ma proff de programmation, elle m'a expliqué tout en me disant que ce n'était pas du programme de DUT Semestre 1, ce pourquoi, j'avais du mal...
Quand je met V.erase(i), ce n'est donc pas possible car i nest pas une adresse. Il faut donc utiliser V.begin() qui est donc ladresse du Vectore et faire V.erase(V.begin() + i)
Ainsi, V.erase agit sur une adresse : V.begin()+ i
et non sur un entier comme je le faisais ;)
De la sorte, j'obtiens le programme qui suit, dans lequel j'ai encore une erreur queje n'arrives toujours pas à corriger malgrès mes vérifications. Ce n'est donc plus une erreur de compilation, mais de raisonnement.
Quand je met V.erase(i), ce n'est donc pas possible car i nest pas une adresse. Il faut donc utiliser V.begin() qui est donc ladresse du Vectore et faire V.erase(V.begin() + i)
Ainsi, V.erase agit sur une adresse : V.begin()+ i
et non sur un entier comme je le faisais ;)
De la sorte, j'obtiens le programme qui suit, dans lequel j'ai encore une erreur queje n'arrives toujours pas à corriger malgrès mes vérifications. Ce n'est donc plus une erreur de compilation, mais de raisonnement.
#include <vector> #include <iostream> using namespace std; void init(vector <int> &V) { for(int i=0;i<V.size();i++) V[i]=i+1; } void nombre_chanceux(vector <int> &V) { for(int i=1;i<V.size();i++) V.erase(V.begin() + i); int z=1; int j=V[z]; while(j<V.size()) { int i=1; while(i<V.size()) { if(i%j) V.erase(V.begin() + i-1); i++; } z+=1; j=V[z]; } } int main() { vector <int> V(50); init(V); nombre_chanceux(V); for(int i=0;i<V.size();i++) cout << "Nombres Chanceux : " << V[i] << " "; system("PAUSE"); return 0; }
Bonsoir,
Pour le erase, je n'avais aucune chance de deviner...
Pour la logique de ton programme, ta condition ( i % j ) ne convient visiblement pas. Elle est vraie ( !=0) dès que i n'est pas un mutilple de j, ce qui doit arriver assez souvent. Je pense que tu voulais écrire ( i% j == 0 ).
Mais ça ne suffit pas encore bon.
Pourquoi le -1 dans V.erase(V.begin() + i-1); ? A cause de l'élément effacé qui décale la suite du vecteur, je suppose. Je crois bien que le -1 est mal placé.
Un conseil : si le programme passe en compilation, fais le tourner en affichant l'état de ton vecteur juste avant le z+=1 pour mieux comprendre ce qui se passe.
Pour le erase, je n'avais aucune chance de deviner...
Pour la logique de ton programme, ta condition ( i % j ) ne convient visiblement pas. Elle est vraie ( !=0) dès que i n'est pas un mutilple de j, ce qui doit arriver assez souvent. Je pense que tu voulais écrire ( i% j == 0 ).
Mais ça ne suffit pas encore bon.
Pourquoi le -1 dans V.erase(V.begin() + i-1); ? A cause de l'élément effacé qui décale la suite du vecteur, je suppose. Je crois bien que le -1 est mal placé.
Un conseil : si le programme passe en compilation, fais le tourner en affichant l'état de ton vecteur juste avant le z+=1 pour mieux comprendre ce qui se passe.
Salut.
Bon alors, vector c'est du C++ standard, c'est un template qui fait partie de la STL.
Si tu as vraiment besoin de du remove, utilise d'autre modèles de la STL que vector. <list> par exemple. Vector est très bien à condition de ne pas avoir de nombre à insérer ou à supprimer au mileu, et de ne pas avoir à faire de tri.
voir là : https://en.cppreference.com/w/
pour tes suppression de nombre, je pense que je parcourerai le tableau et mettrai les valeur à supprimer à 0 sans modifier la taille dans un premier temps.
Puis dans un second tableau, je récupère les nombres qui n'ont pas été supprimer avec vector::push_back(T)
Voila.
Bon alors, vector c'est du C++ standard, c'est un template qui fait partie de la STL.
Si tu as vraiment besoin de du remove, utilise d'autre modèles de la STL que vector. <list> par exemple. Vector est très bien à condition de ne pas avoir de nombre à insérer ou à supprimer au mileu, et de ne pas avoir à faire de tri.
voir là : https://en.cppreference.com/w/
pour tes suppression de nombre, je pense que je parcourerai le tableau et mettrai les valeur à supprimer à 0 sans modifier la taille dans un premier temps.
Puis dans un second tableau, je récupère les nombres qui n'ont pas été supprimer avec vector::push_back(T)
Voila.
Bon, j'ai réussi, même si je dois avouer qu'un prof m'a aidé à regarder le déroulement du programme au brouillon. IL me manquait juste un petit qqch.
Sinon char sniper, je nai pas encore vus les listes, je ne suis qu'en S1 de DUT Informatique. Quant a la deuxième technique, je lavais testé, elle marchait, mais je voulais réussir celle-ci, qui est plus pertinente à mon gout.
Merci beaucoup à toi le père, pour tes nombreux conseils et l'aide que tu m'as apportée. ;)
Azerty
#include <vector> #include <iostream> using namespace std; void init(vector <int> &V) { for(int i=0;i<V.size();i++) V[i]=i+1; } void nombre_chanceux(vector <int> &V) { for(int i=1;i<V.size();i++) V.erase(V.begin() + i); int p; for (int z=1;z<V.size();z++) { p=1; while ( p*(V[z]-1)<V.size() ) { V.erase(V.begin() + p*(V[z]-1)); p++; } } } int main() { vector <int> V(50); init(V); nombre_chanceux(V); for(int i=0;i<V.size();i++) cout << "Nombres Chanceux : " << V[i] << " " << endl; system("PAUSE"); return 0; }
Sinon char sniper, je nai pas encore vus les listes, je ne suis qu'en S1 de DUT Informatique. Quant a la deuxième technique, je lavais testé, elle marchait, mais je voulais réussir celle-ci, qui est plus pertinente à mon gout.
Merci beaucoup à toi le père, pour tes nombreux conseils et l'aide que tu m'as apportée. ;)
Azerty