La norme C ++ dit-elle que je devrais pouvoir comparer deux itérateurs stl construits par défaut pour l'égalité? Sont comparables à des itérateurs construits par défaut?
Je souhaite ce qui suit, à l'aide de STD :: Liste par exemple: p> Ce que je veux ici est quelque chose comme une valeur null Pour les itérateurs, mais je ne suis pas sûr si c'est légal. Dans la mise en œuvre de STL incluse avec Visual Studio 2008, ils comprennent des assertions dans STD :: Liste ''s Operator == () qui excluent cette utilisation. (Ils vérifient que chaque itérateur est "possédé" par le même conteneur et les mêmes itérateurs construits par défaut n'ont pas de conteneur.) Cela indiquerait que ce n'est pas légal, ni peut-être qu'ils sont trop zélés. P> P> P> P> P> >
4 Réponses :
Je crois que vous devriez passer une plage void fun(std::list<int>::iterator beg, std::list<int>::iterator end)
{
while(beg != end)
{
// do what you want here.
beg++;
}
}
Peut-être vrai, mais ne répond pas à la question.
Je comprends ce que vous dites, mais la sémantique appelle vraiment un seul article - un peu comme STD :: Liste :: Effacer (). Je suis peut-être abuser du concept d'itérateur; C'est ce que je suis intéressé à la découverte.
Arak, par quels moyens pouvez-vous avoir un itérateur "null" à passer?
@Andy, je n'ai pas compris votre question.
Le point est que la fonction de plage a le même problème - et donne une bonne raison pour permettre la comparaison en C ++ 14. Vous pouvez construire par défaut 'beg' et «fin» dans la routine d'appel (puis éventuellement les mettre à une plage réelle) et appelez «amusement». Cela nécessite le même test entre deux itérateurs construits par défaut 'beg' et «fin». (Vous ne pouvez pas supposer que la routine d'appel a toujours accès à un conteneur approprié.)
OK, je vais faire un coup de poignard. Norme C ++, Section 24.1 / 5: P>
Les itérateurs peuvent aussi avoir singulier valeurs qui ne sont pas associées à tout conteneur. [Exemple: après le Déclaration d'une inaidification pointeur x (comme avec int * x;), x doit toujours être supposé avoir un singulier valeur d'un pointeur. ] Résultats de la plupart Les expressions sont indéfinies pour singulier valeurs; La seule excepte est une affectation d'une valeur non singulière à un itérateur qui tient un singulier valeur. p> blockQuote>
Donc, non, ils ne peuvent pas être comparés. P>
Qu'en est-il de `std :: istream_iterator. C'est exactement comment vous comparez le test pour la fin.
Spécification indique que la post-conciliement du constructeur par défaut est que itérateur est Singular . La comparaison pour l'égalité ne sont pas définies, il peut donc être différent dans une implémentation. P>
Cela va changer en C ++ 14. [AVANT.PRORITATEURS] 24.2.5P2 de N3936 dit P>
Cependant, les itérateurs initialisés à la valeur peuvent être comparés et comparera égal à d'autres itérateurs initialisés par la valeur du même type. p> blockQuote>
Je frappe cela en ce moment lors de la mise en œuvre de quelque chose au travail :( Je souhaitais avoir eu C ++ 2014, mais il suffit d'avoir Visual Studio 2012: D
Ce n'est toujours pas une bonne idée même en C ++ 14 car les itérateurs non singuliers ne peuvent pas être comparés contre un itérateur initialisé de valeur.
Non, cela ne change pas vraiment. Juste parce que vous pouvez comparer deux itérateurs initialisés à valeur ne signifie pas que vous pouvez comparer un itérateur initialisé à valeur avec un autre itérateur. Vous ne pouvez pas. Dans ce dernier cas, le comportement est toujours indéfini même après C ++ 14.
Boost :: Facultatif Code> vous vient à l'esprit.