On m'a posé cette question que je ne sais pas vraiment pourquoi.
Si vous avez un pointeur Par exemple: P> 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>
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 :
Cependant, seuls les itérateurs d'accès aléatoire peuvent être comparés à l'aide de rien d'autre que A std :: vecteur :: itérateur code> est un itérateur d'accès aléatoire et vous pouvez certainement les comparer avec
<< / code> et
> code>. p>
== code> et
! = code>. Les itérateurs bidirectionnels, avant et d'entrée définissent uniquement les opérateurs de comparaison d'égalité / inégalité. P>
std :: list :: itérateur code>, par exemple est un itérateur pointant sur un membre non spécifié d'un
std :: list code>. Dans ce cas, il n'y a rien de sens à un autre type de comparaison. P>
BTW: Votre exemple de code ira bien pour utiliser opérateur << / code> et
Opérateur> code> ne peut être utilisé qu'avec randomAccessiterator . Mais
opérateur! = Code> pourrait également être utilisé avec INTATITÉTRATEUR , Forfaititerator et bidirectionaliterator . Pour votre exemple de code,
it! = Myvector.end () code> et
il
std :: list code> ou
std :: map code> etc.). p>
opérateur << / code> ou
Opérateur> code>, puisque l'itérateur de
std :: vecteur code>
est aléatoireAccessiterator p>. p>.
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
@ user4099855 a également travaillé pour moi, même avec GCC 4.8.4 (
Le concept de
@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
-std = c ++ 11 code> ici . Ça devrait bien se passer.
-std = c ++ 1y code>).
std :: vecteur :: itérateur code> change effectivement à contiguissant? Il n'y a pas encore de page sur CPPreference donc je ne peux pas facilement vérifier
<< / code> ou
> code> au lieu de
! = Code> contraintes b> Votre algorithme générique à Accès aléatoire < / I> Itérateurs.
Le problème est que MAINTENANT, pourquoi vous souciez d'utiliser Supposons que vous ayez du code générique: P> 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.
et
et
et
> code> si
! = code> a le même effet et fonctionne toujours? p>
template <class It>
void foo(It begin, It end)
{
while (--end != begin)
apply(*begin);
}
Une raison de la descente?
La question était 'pourquoi ...?' I>, 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" i>) et l'exemple montre un scénario possible pour le problème.
J'admets, la phrase citée en fait est i> 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)
Que voulez-vous dire?
Également lié: Pourquoi est-il préférable de Utilisez '! = "que' <'dans une boucle de vecteur? (C ++) a>
Mind You, vous ne pouvez utiliser que
<< / code> sur deux pointeurs au même tableau i>, mais pas sur des pointeurs non liés.