Effacer un élément d'une liste à l'aide d'un itérateur inverse
Il est possible de rencontrer un scénario où vous souhaitez supprimer un élément d'une list en utilisant un itérateur inverse, mais la fonction delete() n'accepte qu'un itérateur normal. Cela peut poser un défi, car convertir un itérateur inversé en itérateur régulier n'est pas simple.
Solution :
La clé pour résoudre ce problème réside dans la compréhension de la relation entre un itérateur inverse et son itérateur de base. Selon la norme C, l'itérateur de base d'un itérateur inverse i est &*(i - 1). Cela signifie que pour obtenir l'itérateur de base, on décrémente i.
Exemple :
Considérons l'extrait de code suivant :
for ( std::list< Cursor::Enum & >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i ) { if ( *i == pCursor ) { m_CursorStack.erase( --(i.base()) ); break; } }
Dans ce Par exemple, l'itérateur de base est obtenu en décrémentant i.base(). En passant cet itérateur de base à la fonction Eraser(), nous pouvons réussir à supprimer l'élément souhaité de la liste.
Solutions C 11 :
Pour C 11 et versions ultérieures , deux solutions supplémentaires sont disponibles :
m_CursorStack.erase( std::next(i).base() );
Cette solution reste inchangée, tandis que std::next() est utilisée pour avancer l'itérateur inverse d'une position, récupérant efficacement son itérateur de base .
std::advance(i, 1); m_CursorStack.erase( i.base() );
Dans cette solution, l'itérateur inverse est avancé d'une position à l'aide de std::advance(), qui aligne efficacement son itérateur de base avec l'élément souhaité pour l'effacement.
Quelle que soit la solution que vous choisissez, ces approches fournissent des méthodes claires et simples pour effacer des éléments d'une liste à l'aide d'un itérateur inverse.
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!