La suppression de l'élément de vecteur, alors qu'en C++11 de la gamme "pour" boucle?

J'ai un vecteur de IInventory*, et je suis en parcourant la liste à l'aide de C++11 gamme pour, faire des choses avec chacun d'eux.

Après avoir fait quelques trucs avec un, je souhaiterez peut-être supprimer de la liste et supprimer l'objet. Je sais que je peux appeler delete sur le pointeur de tout temps à la nettoyer, mais quelle est la bonne façon de le supprimer à partir du vecteur, tandis que dans la gamme for boucle? Et si je le supprime de la liste de mes boucle d'être invalidée?

std::vector<IInventory*> inv;
inv.push_back(new Foo());
inv.push_back(new Bar());

for (IInventory* index : inv)
{
    //Do some stuff
    //OK, I decided I need to remove this object from 'inv'...
}
  • Si vous voulez obtenir la fantaisie, vous pouvez utiliser std::remove_if avec un prédicat qui fait les choses" et retourne true si vous souhaitez que l'élément supprimé.
  • Est-il une raison pourquoi vous ne pouvez pas ajouter un index de compteur et ensuite utiliser quelque chose comme inv.effacer(index)?
  • Qui serait encore vis de l'itération.
  • et ce serait une performance killer - sur tous les effacer, vous aurez à déplacer tous les éléments après le effacée).
  • i-- après le supprimer. Ou effectuer une itération vers l'arrière avec l'entier des indices.
  • Qui a encore O(N^2) complexité.
  • J'ai recommandé le passage à std::list ci-dessous

InformationsquelleAutor EddieV223 | 2012-04-28