Vectors C++ : éffacer une case

Résolu/Fermé
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 - 7 déc. 2007 à 19:21
 Ploup - 18 déc. 2008 à 00:17
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

24 réponses

azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 75
12 déc. 2007 à 00:06
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.

#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;
}
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.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 déc. 2007 à 08:52
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.
0
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 75
12 déc. 2007 à 13:45
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.

#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
0