2010-12-06 5 views
2

Puisque je sais qu'un itérateur dans le programme a pu être invalidé par une opération précédente, je veux l'invalider explicitement. Tels qu'affecter NULL à un pointeur pour l'invalider, je veux juste faire la même chose sur itérateur. container.end() ne pouvait pas être l'idée précise ici. J'ai essayé d'assigner NULL à mon itérateur, mais il a échoué. Comment puis-je obtenir le même comportement du pointeur NULL sur itérateur?Comment invalider un itérateur?

+0

D'abord, je pense que ce n'est pas une bonne idée d'un tel comportement. Deuxièmement, vous pouvez stocker le pointeur vers l'itérateur. – W55tKQbuRu28Q4xv

+1

Si vous voulez vraiment quelqu'un peut également expliquer comment obtenir comportement Undefined explicitement ;-) – kriss

+0

Pourquoi voudriez-vous cela? Il n'y a rien que vous puissiez faire avec l'itérateur après ce que vous ne pouviez pas faire auparavant. – MSalters

Répondre

1

Cela ne devrait-il pas toujours fonctionner? (les itérateurs sont toujours assignables et par défaut constructibles)

template <typename Iter> 
void foo(Iter it){ 
    it = Iter(); // invalidate 
} 
+0

C'est très cool. Je peux obtenir le type d'itérateur directement, donc la fonction est inutile. Soit dit en passant, je pense que nous devons le transmettre par référence, n'est-ce pas? – Thomson

+0

afin de le modifier, bien sûr. C'était juste un exemple. La seule raison pour laquelle je l'ai fait fonctionner était que c'était la manière la plus simple de dire "En supposant que le type d'itérateur est' Iter' et que l'objet d'itération s'appelle 'it' ..." :) – jalf

2

Pourquoi ne pas vous voulez utiliser container.end() ... cela fonctionne pour la plupart des conteneurs ...

Pour std :: string Vous pouvez vérifier, wether la position est yourstring.npos?;

4

pourrait être invalidée par quelque opération précédente, je veux annuler explicitement

... Si vous savez qu'il ne peut pas être valide, tout ce que vous devez le faire cesser de l'utiliser . Invalider l'itérateur n'effectue explicitement rien, car l'utiliser est une erreur de programmation de toute façon.

+2

essayez de limiter la portée de votre itérateur en utilisant des blocs supplémentaires. En dehors du bloc, l'itérateur n'est plus là. C'est mieux que non valide. –

1

Vous ne pouvez pas, en général. Il y a quelques itérateurs qui ne peuvent pas être invalidés du tout. Par exemple, un générateur de nombres aléatoires peut être modélisé comme un itérateur de sortie, operator* renvoyant le nombre actuel et operator++ générant un nouveau.

Questions connexes