2016-12-05 2 views
0

Ich versuche, ein Programm zu schreiben, wo einen Vektor gegeben, verwenden Sie Iteratoren, um die erste und letzte Nummer des Vektors zu vergleichen, dann zieht ein und vergleicht die nächsten. Ich habe die for-Schleife geschrieben, um das zu tun, aber bin mir nicht sicher, wie ich sie stoppen kann, sobald sie die Mitte des Vektors erreicht haben.Iterating durch einen Vektor zum Vergleich in C++

Für die for-Schleife Ich habe:

for (a = v.begin(), b = v.rbegin(); a != v.end(), b != v.rend(); a++, b++) 

wo a die Vorwärts-Iterator und b ein rückwärts Iterator ist. Meine Annahme ist, dass ich den Zustand der for-Schleife ändern muss, aber ich bin unsicher was.

+0

bedeuten Sie einige ‚is_palindrome‘ -Funktion? – xtofl

+1

Zumindest sollten Sie die Bedingung ändern, um '&&' zu verwenden. – Iluvatar

+0

Ihre Schleifenbedingung 'a! = V.end(), b! = V.Rend()' verwendet den Kommaoperator, um beide Unterausdrücke auszuführen, aber das Ergebnis der ersten ('a! = V.end()) ') wird weggeworfen und nur das Ergebnis des zweiten Ausdrucks wird verwendet. Was das "Erreichen der Mitte des Vektors" betrifft, könnte es sinnvoller sein, hier * Indizes * anstelle von Iteratoren zu verwenden. Dann wäre es leicht zu sehen, ob die Indizes den "Mittelpunkt" der Vektorlänge überschreiten. –

Antwort

1

Also denken Sie daran, dass std::vector<T>::iterator ein random-access iterator ist, was bedeutet, dass es operator< definiert hat.

diese Verwendung und die Verwendung der std::reverse_iterator<Iterator>::base() Member-Funktion, können wir umschreiben Ihre for-Schleife auf die folgenden:

auto a = v.begin(); 
auto b = v.rbegin(); 
for (; a < b.base(); ++a, ++b) 
{ 
    // Do stuff... 
} 
1

Zunächst einmal müssen Sie && und nicht die , Betreiber im Vergleich zu verwenden, die tut nicht, was Sie denken, dass es tut.

Für Ihre spezifische Frage, die Sie gehen einfach weiter, bis beide Iteratoren einander erreichen, können Sie die zugrunde liegenden std::iterator eines std::reverse_iterator durch base() erhalten, zB:

template<typename T> bool isPalindrome(const std::vector<T>& data) 
{ 
    for (auto it = data.begin(), it2 = data.rbegin(); it != data.end() && it2 != data.rend() && 
      it != it2.base(); ++it, ++it2) 
     if (*it != *it2) 
      return false; 

    return true; 
}