Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer des cases d'un std::vector

n'importe laquelle

Sujet résolu
6 août 2008 à 21:33:51

Coucou me revoila avec mon std::vector :D

Je voudrais juste pouvoir supprimer une case de mon vector.
  • La fonction pop_back() efface la derniere case c'est pas ce que je veux
  • La fonction clear() efface tout c'est pas non plus ce que je veux.
Je voudrais effacer n'importe quelle case.

Est ce possible ? Cela pose t'il des problemes ?

merci
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:37:02

tu dois utiliser erase(), en lui passant un itérateur sur la case à supprimer.
La fonction te renvoit un iterateur sur la case qui était après (et qui devient celle actuelle) et dans le cas des vector, cela invalide les autres iterateurs que tu aurais sur ce vecteur.
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:41:16

Question bête c'est quoi un itérateur ? c'est un i pour parcourir un tableau avec une boucle par exemple ?

Je dois donc faire ca :tableau.erase(i);
Mais je ne comprend pas ton histoire de renvoit d'un iterateur :euh: . Ca donne quoi ?
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:43:10

Si tu veux supprimer une valeur en particulier, tu peux utiliser std::find() ou std::find_if() pour trouver l'élément à supprimer.

Un itérateur est une abstraction du concept de séquence. Techniquement, un itérateur s'emploie comme un pointeur sur un élément d'une séquence (vecteur, liste, pile, etc.)
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:47:27

Citation : Ice_Keese

Si tu veux supprimer une valeur en particulier, tu peux utiliser std::find() ou std::find_if() pour trouver l'élément à supprimer.


Bof c'est des objets qu'il y a dans mon tableau du coup c'est pas trop ca que je cherche.

Citation : Ice_Keese

Un itérateur est une abstraction du concept de séquence. Techniquement, un itérateur s'emploie comme un pointeur sur un élément d'une séquence (vecteur, liste, pile, etc.)


Rien compris :-°
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:49:32

Ton index, le doigt, quand tu apprenais à lire au primaire, tu le déplaçais de mot en mot pour savoir où tu en étais.
Ben, c'est un itérateur.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
6 août 2008 à 21:50:19

std::vector monTableau;

monTableau.erase(monTableau.begin() + i);

ou i est l'indice de la case a supprimer.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
6 août 2008 à 21:51:58

Citation : Nanoc

monTableau.erase(monTableau() + i);



Euh... je verrais mieux monTableau.begin() + i (vector ne possédant pas d'opérateur ()).
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:54:49

Citation : Nanoc

monTableau.erase(monTableau() + i);


Je ne doute pas que ca marche (pas encore essayé) mais c'est bizarre pourquoi passer montableau() ? J'ai rien trouvé dans ton tuto au sujet d'un truc dans le genre.
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 21:58:38

montableau.begin()+i

je m'ai trompé.

Et il y a rein dans le tuto, parce que je présente que la base et que les itérateurs posent pas mal de problème lors de l'effacement si on le fait pas correctement, chose qui sortait du cadre du tuto court.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
6 août 2008 à 22:00:46

Citation : Aravis

Citation : Nanoc

monTableau.erase(monTableau() + i);


Je ne doute pas que ca marche (pas encore essayé) mais c'est bizarre pourquoi passer montableau() ? J'ai rien trouvé dans ton tuto au sujet d'un truc dans le genre.



erase() prend un itérateur (donc, un pointeur, ou un objet qui s'utilise comme un pointeur). begin() renvoie un itérateur sur le premier élément du vecteur. Le résultat de l'opération begin() + i produit un itérateur sur le i-ième élément du vecteur (de la simple arithmétique de pointeur).
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 22:01:56

Avec le begin ça compile mieux !

Citation : Nanoc

Et il y a rein dans le tuto, parce que je présente que la base et que les itérateurs posent pas mal de problème lors de l'effacement si on le fait pas correctement, chose qui sortait du cadre du tuto court.


C'est un peu une façon de dire que ça va pas marcher (ou mal) ?
Quels sont les pb que je peux avoir ?
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 22:11:28

Problèmes ? Pas plus que pour le push_back : invalidation de tous les itérateurs et autres pointeurs déjà extraits.

@Ice_Keese, un itérateur n'est pas un pointeur (ce n'est donc pas un argument valide pour erase). Par contre les pointeurs sont des itérateurs triviaux dans le contexte de tableaux en mémoire.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
6 août 2008 à 22:18:21

Citation : lmghs

Problèmes ? Pas plus que pour le push_back : invalidation de tous les itérateurs et autres pointeurs déjà extraits.

@Ice_Keese, un itérateur n'est pas un pointeur (ce n'est donc pas un argument valide pour erase). Par contre les pointeurs sont des itérateurs triviaux dans le contexte de tableaux en mémoire.



Je ne me rappelle pas avoir oublié de dire que ça pouvait également être un objet s'employant comme un pointeur...
  • Partager sur Facebook
  • Partager sur Twitter
6 août 2008 à 22:53:15

Sauf que c'est le contraire.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
8 août 2008 à 9:23:42

Aravis, si tu veux aller plus loin, je te conseille un peu de lecture.
Ceci devrait t'intéresser :
http://cpp.developpez.com/cours/cpp/?page=page_20#LXX
http://r0d.developpez.com/articles/algos-stl/

C'est peut-être pas du "tout cuit prémaché" pour un débutant mais si tu as des questions sur des éléments que tu ne comprends pas, n'hésite pas à poser des questions ici (après une petite recherche de préférence..) :)

Le premier lien traite des conteneurs de la STL comme vector. A priori, c'est suffisant pour réaliser ce que tu veux faire.
Le second traite des algorithmes de la STL. Ces algorithmes classiques peuvent s'appliquer à un bon nombre de conteneurs. Leur utilisation permet vraiment de gagner un temps fou. Si les méthodes de la classe vector ne te suffisent déjà pas dans ton cas, je te pari un carambar que un de ces algorithmes permet de résoudre ton problème en moins d'une ligne.
  • Partager sur Facebook
  • Partager sur Twitter
Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
27 décembre 2017 à 1:14:33



-
Edité par maamoune97 27 décembre 2017 à 1:16:14

  • Partager sur Facebook
  • Partager sur Twitter
30 janvier 2018 à 23:24:05

Bonjour,

Je me pose la même question.

J'ai un tableau qui contient des objets de type personnages (le but est de faire une collection hétérogène comme sur le cours de ce site).

 vector<Personnage*> listeMechants;

Quand un personnage meurt, je veux le supprimer de la liste mais je n'y parviens pas avec :

listeMechants.erase(2);

Pourtant, la commande listeMechants.erase(2) fonctionne...

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
31 janvier 2018 à 4:48:09

Bonjour, ce sujet date de 2008, merci de créer un nouveau topic.
  • Partager sur Facebook
  • Partager sur Twitter