+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    825
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 825
    Points : 576
    Points
    576

    Par défaut Suppression d'un element d'un tableau d'objet

    Bonjour,

    Admettons que l'on ait un tableau d'objets quelconque :
    Code :
    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 :
    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 chevronné
    Avatar de ZouBi
    Inscrit en
    octobre 2007
    Messages
    506
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : octobre 2007
    Messages : 506
    Points : 780
    Points
    780

    Par défaut

    non, tu dois utiliser des pointeurs et allocation dynamiques.

    Voilà ce que ca donne chez moi

    Code :
    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 :
    1
    2
    3
    for(int i=0; i<m_nb_elements; i++)
    		delete m_liste_elements[i];
    	delete[] m_liste_elements;

  3. #3
    Membre émérite

    Inscrit en
    septembre 2006
    Messages
    717
    Détails du profil
    Informations forums :
    Inscription : septembre 2006
    Messages : 717
    Points : 842
    Points
    842

    Par défaut

    Si t'es masochiste, utilise la solution de ZouBi ;-)
    Sinon utilise std::vector et sa fonction erase().

  4. #4
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    825
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 825
    Points : 576
    Points
    576

    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é Sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2003
    Messages
    3 550
    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 550
    Points : 4 615
    Points
    4 615

    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 :
    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
    Modérateur
    Avatar de koala01
    Inscrit en
    octobre 2004
    Messages
    9 783
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 783
    Points : 17 346
    Points
    17 346

    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 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 022
    Points : 12 397
    Points
    12 397

    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 :
    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.

  8. #8
    Expert Confirmé Sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2003
    Messages
    4 783
    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 : 4 783
    Points : 7 959
    Points
    7 959

    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...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •