1 votes

Iterator des deux extrémités d'un Vecteur

J'ai un vecteur de IntRect : vector.

Comment puis-je itérer à partir des deux extrémités de la liste et arrêter l'itérateur lorsqu'il se croise ?

vector<IntRect>::iterator itr = myVector.begin();
  vector<IntRect>::reverse_iterator revItr.rbegin();

  for (; /*check itr and revItr does not intersect, and itr and revItr do not end */ ; ++itr, ++revItr) {
    IntRect r1 = *itr;
    IntRect r2 = *revItr;

    // do something with r1 and r2

  }

Merci.

4voto

Peter Points 5388
if(!myVector.empty()) {
    for(vector<IntRect>::iterator forwards = myVector.begin(), 
                                  backwards = myVector.end()-1;
        forwards < backwards;
        ++forwards, --backwards) {

            // do stuff
    }
}

Je pense que vous devez vérifier empty() avec cette mise en œuvre - je soupçonne que end()-1 n'est pas défini si le vecteur est vide. Je ne l'ai pas utilisé auparavant, mais la STL de Dinkumware a au moins l'opérateur < défini pour les itérateurs de vecteurs et il semble faire quelque chose de sensible.

Notez également que vous devez vérifier <, et pas seulement l'égalité - cela permet de résoudre le cas (courant) où votre vecteur a un nombre pair d'entrées et où les deux itérateurs se dépasseraient l'un l'autre.

1voto

avakar Points 20031

Vous pouvez utiliser base sur l'itérateur inverse et comparez le résultat avec votre itérateur avant.

Rappelez-vous que si vous déplacez les deux itérateurs, ils ne seront jamais égaux si la séquence a un nombre impair d'éléments. Vous devez vérifier l'égalité deux fois à chaque itération.

1voto

rgtk Points 245

Aucune des réponses que j'ai vues n'explique les deux itérateurs "passant dans la nuit".

vector<IntRect>::iterator forward = myVector.begin(), backward = myVector.end();

while (forward != backward)
{
    ++forward;

    // at this point they _could_ be equal
    if (forward == backward)
        break;

    --backward;
}

0voto

rlbond Points 24215

Vos itérateurs pointent vers la même chose si &(*itr) == &(*revItr)

En supposant que personne n'a fait quelque chose de stupide et surchargé operator& sur IntRect.

0voto

Timo Geusch Points 16952

Je remplacerais le deuxième itérateur (inverse) par un itérateur normal et je l'initialiserais à --myVector.end() . Au lieu de l'incrémenter, décrémentez-le et comparez les valeurs de l'itérateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X