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 :

Suppression d'un element d'un tableau d'objet


Sujet :

C++

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Suppression d'un element d'un tableau d'objet
    Bonjour,

    Admettons que l'on ait un tableau d'objets quelconque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            maClasse tableau[5];
    Je souhaiterai supprimer le iéme element de mon tableau, peut on copier un objet simplement en faisant : monObjetTampon = monObjet.
    En fait ce que je pensais faire, c'est :

    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
     
    // soit n l'indice de l'element a supprimer, n etant recupere ailleurs
     
    maClasse tableauTampon[4];
    i=0;
    j=0;
    while(i<nombreObjets)
    {
       if(i != n)
      {
        tableauTampon[j] = tableau[i];
        j++;
      }
       else
         printf(" L'element %d a ete supprime \n",n);
     
    i++;
    }
     
    tableau = tableauTampon;
    Est - ce possible;
    Est-il suffisant de mettre "=" pour recopier un objet dans un autre voire un tableau d'objet dans un autre ou faut-il utiliser une methode pour cela;

    Merci

  2. #2
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    non, tu dois utiliser des pointeurs et allocation dynamiques.

    Voilà ce que ca donne chez moi

    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
    34
    void ListeElements::supprimer(int pos)
    {
    	int i;
     
    	Element** tmp_liste_elements = new Element*[m_nb_elements];
    	for(int i=0; i < m_nb_elements; i++)
    		if( i == pos )
    		{
    			delete m_liste_elements[i];
    			tmp_liste_elements[i] = NULL;
    		}
    		else
    		{
    			tmp_liste_elements[i] = m_liste_elements[i];
    		}
     
    	m_nb_elements--;
    	delete m_liste_elements;
    	m_liste_elements = new Element*[m_nb_elements];
     
    	i = 0;
    	while(tmp_liste_elements[i] != NULL)
    	{
            m_liste_elements[i] = tmp_liste_elements[i];
            i++;
    	}
    	while( i < m_nb_elements )
    	{
            m_liste_elements[i] = tmp_liste_elements[i+1];
            i++;
    	}
     
    	delete tmp_liste_elements;
    }
    ( et qu'on m'dise pas encore d'utiliser des vecteurs... )

    et ne pas oublier à desallouer à la fin de ton programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<m_nb_elements; i++)
    		delete m_liste_elements[i];
    	delete[] m_liste_elements;

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Si t'es masochiste, utilise la solution de ZouBi ;-)
    Sinon utilise std::vector et sa fonction erase().

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je ne connais pas std::vector ni la méthode erase(), pour l'utiliser il faut que mes objets héritent d'un classe en particuliere?
    Je ne connais pas le C++, y a t-il une doc du style des API java pour que je puisse m'y retrouver?

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ta solution aurait été parfaitement valide si tu n'avais pas utilisé les tableaux de C mais std::tr1::array.
    En effet, les tableaux de C ne sont pas Assignable.

    Ton code corrigé :
    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
    34
    35
    #include <iostream>
    #include <tr1/array>
     
    using std::tr1::array;
     
    struct maClasse {};
     
    int main()
    {
    	array<maClasse, 5> tableau;
    	int nombreObjets = 4;
     
    	array<maClasse, 5> tableauTampon;
    	int i = 0;
    	int j = 0;
     
    	int n = 2;
    	while(i < nombreObjets)
    	{
    		if(i != n)
    		{
    			tableauTampon[j] = tableau[i];
    			j++;
    		}
    		else
    			std::cout << "L'élément " << n << " a été supprimé" << std::endl;
     
    		i++;
    	}
    	nombreObjets--;
     
    	tableau = tableauTampon;
     
    	return 0;
    }
    Cela reste assez stupide.
    Mieux vaut faire un memmove(tableau+n, tableau+n+1, nombreObjets-n-1)
    Boost ftw

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Le C++ est un langage orienté objet, qui fournit de manière standard une quantité non négligeable de conteneurs prévus pour fonctionner avec n'importe quoi... Il serait dommage de se priver de les utiliser.

    En effet, la proposition de ZouBi, pour correcte qu'elle soit, présente l'énorme inconvénient... de te forcer à gérer toi même la mémoire, à la manière de ce qui se fait en C.

    Il faut savoir que, en C++, on préfère réserver l'utilisation des pointeurs et de l'allocation dynamique de la mémoire aux quelques cas dans lesquels on est réellement obligé de les utiliser.

    En l'occurrence, la gestion des éléments d'un conteneur n'est pas un cas d'obligation

    Aussi, ainsi que Sylvain Togni l'a fait valoir, tu devrais t'intéresser très sérieusement aux différents conteneurs de la STL.

    Profites-en pour réfléchir éventuellement au fait qu'un tableau présente un avantage lorsqu'il s'agit d'avoir un acces direct (aléatoire) aux différents éléments, mais présente des inconvénients majeurs en ce qui concerne l'accès séquentiel, l'ajout ou la suppression d'éléments.

    D'autres conteneurs fournissent des accès séquentiels qu'il pourrait s'avérer intéressant pour toi d'utiliser
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    Je ne connais pas std::vector ni la méthode erase(), pour l'utiliser il faut que mes objets héritent d'un classe en particuliere?
    Non, pas besoin. Il faut juste que tes objets soient correctement copiables.

    En gros, ton code s'écrirait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<maClasse> tableau(5);
    tableau.erase(tableau.begin() + n);
    Erase prend en paramètre ce qu'on appelle un itératuer, sui est une sorte de pointeur à l'intérieur d'un tableau, tableau.begin() retourne l'itérateur sur le premier élément, et le +n le fait avancer de 5 cases.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Je ne peux également que te conseiller vivement de t'intéresser vivement au vecteurs et autres éléments de la bibliothèque standard du C++.

    Accessoirement, si les objets initiaux sont bien copiables/affectables, sans sortir le memmove qui ne comprend rien aux objets, il y a std::copy tout simplement pour s'épargner la boucle à la main. Suivant les propriétés de tes objets, il y a moyen de s'y prendre encore autrement (en jouant avec swap p.ex.).

    Après, est-ce que tes objets sont copiables ou non ? ... Tu es le seul à pouvoir le savoir. (NB: si ce sont des objets entité tirés d'une hiérarchie p.ex., il y a de fortes chances qu'ils n'aient pas à être copiables ; il te faudra alors passer par une couche intermédiaire de pointeurs alors)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Suppression d'une valeur d'un tableau d'objets
    Par kanzarih dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2009, 08h38
  2. [langage] Compter des éléments dans un tableau
    Par helene22500 dans le forum Langage
    Réponses: 29
    Dernier message: 23/05/2005, 11h38
  3. supprimer un element d'un tableau vector
    Par boby61 dans le forum SL & STL
    Réponses: 22
    Dernier message: 23/03/2005, 20h49
  4. Réponses: 3
    Dernier message: 20/09/2004, 12h23
  5. [langage] supprimer le premier élément d'un tableau
    Par Kinethe dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2004, 15h39

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