Maison >développement back-end >C++ >Comment effacer en toute sécurité des éléments d'un conteneur STL à l'aide d'un itérateur inversé ?

Comment effacer en toute sécurité des éléments d'un conteneur STL à l'aide d'un itérateur inversé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-23 05:00:09484parcourir

How to Safely Erase Elements from an STL Container Using a Reverse Iterator?

Suppression d'un élément à l'aide d'un itérateur inverse

Lorsque vous travaillez avec des conteneurs STL, effacer un élément à l'aide d'un itérateur inverse peut poser un défi. Par défaut, la fonction d'effacement attend un itérateur, pas un itérateur inverse.

Pour résoudre ce problème, il existe plusieurs approches :

1. Obtention de l'itérateur de base :

La norme définit une relation entre un itérateur inverse (i) et son itérateur de base correspondant (i.base()) comme &*(reverse_iterator(i)) == & *(i-1). Cela signifie que vous pouvez obtenir l'itérateur de base en appliquant --() à i.base().

2. Solutions spécifiques à C 11 :

En C 11, vous disposez de deux options supplémentaires :

  • std::next(i).base(): Cela renverra l'itérateur de base correspondant à l'élément suivant dans le séquence.
  • std::advance(i, 1); i.base() : Cela avancera l'itérateur inverse d'un et renverra l'itérateur de base correspondant à sa position actuelle.

Exemple de code :

for (std::list<Cursor::Enum>::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i) {
  if (*i == pCursor) {
    // C++11 solution
    m_CursorStack.erase(std::next(i).base());

    // Alternatively, for pre-C++11 or if desired:
    m_CursorStack.erase(--(i.base()));
    break;
  }
}

En suivant ces approches, vous pouvez effacer efficacement un élément d'une liste à l'aide d'un itérateur inverse tout en respectant les exigences de la norme. exigences.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn