10
votes

En C ++, pourquoi ne pouvons-nous pas comparer les itérateurs en utilisant> et

On m'a posé cette question que je ne sais pas vraiment pourquoi.

Si vous avez un pointeur int * x; code>
Vous pouvez comparer les pointeurs avec > code> et car il signifie l'emplacement de la mémoire quelque chose comme 0x0000 0x0004 0x0008 code>, etc. Je sais que les itérateurs et les pointeurs sont différent, mais ils agissent de manière très similaire. P>

Par exemple: P>

vector<int> myVector;

for(int i = 1; i < 101; i++)
{
    myVector.push_back(i);
}

vector<int>::iterator it = myVector.begin();
while(it != myVector.end()) //Why can't we write it < myVector.end()
{
    cout << *it << endl;
    it++;
}


3 Réponses :


4
votes

std :: vecteur :: itérateur est un itérateur d'accès aléatoire et vous pouvez certainement les comparer avec << / code> et > .

Cependant, seuls les itérateurs d'accès aléatoire peuvent être comparés à l'aide de rien d'autre que == et ! = . Les itérateurs bidirectionnels, avant et d'entrée définissent uniquement les opérateurs de comparaison d'égalité / inégalité.

A std :: list :: itérateur , par exemple est un itérateur pointant sur un membre non spécifié d'un std :: list . Dans ce cas, il n'y a rien de sens à un autre type de comparaison.


0 commentaires

10
votes

opérateur << / code> et Opérateur> ne peut être utilisé qu'avec randomAccessiterator . Mais opérateur! = pourrait également être utilisé avec INTATITÉTRATEUR , Forfaititerator et bidirectionaliterator . Pour votre exemple de code, it! = Myvector.end () et il avoir le même effet, mais le premier est plus général, puis le code Fonctionne également avec d'autres itérateurs (par exemple, itérateurs de std :: list ou std :: map etc.).

BTW: Votre exemple de code ira bien pour utiliser opérateur << / code> ou Opérateur> , puisque l'itérateur de std :: vecteur est aléatoireAccessiterator . .


10 commentaires

Il convient toutefois de noter que cela doit être comparable, les deux itérateurs doivent être dans le même domaine (itérant sur le même vecteur ou quelle que soit sa classe sous-jacente).


En fait, je l'ai essayé avec g ++ avec -wall -wextra -std = C ++ 11. Il ne compile pas lorsque vous l'écrivez


@ user4099855 Quel est le message d'erreur? Avez-vous vérifié le commentaire de logicstuff?


Pourquoi le bowvote? Où suis-je tort?


@songyuanyao Encore une fois une de ces personnes non compréhensibles - il semble y avoir des personnes de choisir des réponses au hasard pour la descente ...


@ user4099855 J'ai essayé avec gcc et -std = c ++ 11 ici . Ça devrait bien se passer.


@ user4099855 a également travaillé pour moi, même avec GCC 4.8.4 ( -std = c ++ 1y ).


Le concept de std :: vecteur :: itérateur change effectivement à contiguissant? Il n'y a pas encore de page sur CPPreference donc je ne peux pas facilement vérifier


@Kaboisonneonneault the Description précise est "Un conteneur contigu est Un conteneur prenant en charge les itérateurs d'accès aléatoire ([aléatoires.Access.ative.iterators]) et dont les types d'éléments itérateurs et const_berator sont des itérateurs contigus ([Itérateur.Requirements.General]). "


Ainsi, en utilisant << / code> ou > au lieu de ! = contraintes Votre algorithme générique à Accès aléatoire < / I> Itérateurs.



0
votes

Le problème est que et > code> ne peut pas strong> être toujours utilisé avec des itérateurs, car seuls quelques types d'itérateurs soutiennent de telles opérations (nommément Accès aléatoire Itérateurs et similaires). D'autre part, des opérations de comparaison telles que ! = Code> sont toujours em> disponibles.

MAINTENANT, pourquoi vous souciez d'utiliser et et et > code> si ! = code> a le même effet et fonctionne toujours? p>


Supposons que vous ayez du code générique: P>

template <class It>
void foo(It begin, It end)
{
    while (--end != begin)
        apply(*begin);

}


5 commentaires

Une raison de la descente?


La question était 'pourquoi ...?' , vous donnez simplement un exemple, ce n'est pas la raison de (bien que la bowvote n'était pas la mienne ...).


@Aconcagua Eh bien, je pense que la raison est assez claire ( "seulement quelques types d'itérateurs appuient ces opérations" ) et l'exemple montre un scénario possible pour le problème.


J'admets, la phrase citée en fait est la réponse à la question. Il est en quelque sorte ombré par votre exemple de code, cependant, un peu comme si vous aviez un grand dépliant "hey voir l'inconvénient" et l'explication uniquement dans l'impression fine. Vous auriez évité l'effet si l'explication était la première rencontre de votre réponse ...


@Aconcagua merci pour le conseil! (Je n'essayais pas de vous accuser, naturellement)