Was passiert, wenn ich einen Iterator um 2 inkrementiere, wenn er auf das letzte Element eines Vektors zeigt? In this question zu fragen, wie der Iterator auf einen STL-Container von zwei Elementen zwei verschiedene Ansätze angeboten anzupassen:Was passiert, wenn Sie einen Iterator erhöhen, der dem Enditerator eines STL-Containers entspricht?
- entweder verwenden, um eine Form von arithmetischen Operator - + = 2 oder ++ zweimal
- oder verwenden std :: Voraus()
ich habe beide mit VC++ 7 für den Rand Fall untersucht, wenn der Iterator Punkte auf das letzte Element der STL-Container oder darüber hinaus:
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vector<int>::iterator it = vec.begin();
advance(it, 2);
bool isAtEnd = it == vec.end(); // true
it++; // or advance(it, 1); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance(it, 3);
isAtEnd = it == vec.end(); // false
Ich habe may mal eine Advise gesehen gegen Vektor vergleichen :: end(), wenn Sie den Vektor und andere Behältnisse durchlaufen:
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
//manipulate the element through the iterator here
}
Natürlich, wenn der Iterator nach dem letzten Element in der Schleife fortgeschritten ist der Vergleich in der Die for-loop-Anweisung wird als false ausgewertet, und die Schleife wird glücklich in undefiniertes Verhalten fortgesetzt.
Habe ich richtig verstanden, dass ich diese Situation nicht erkennen kann, wenn ich advance() oder irgendeine Inkrementierungsoperation für einen Iterator verwende und auf das Ende des Containers zeigen lasse? Wenn ja, was ist die beste Vorgehensweise - solche Fortschritte nicht zu verwenden?
Wie kann man überprüfen, ob es in dem Bereich nach Rechenoperation ist? – Narek
Das ist überhaupt nicht überzeugend. Wo ist das Zitat vom Standard? Ich kann Josuttis Behauptung im Moment nicht bestätigen. :( –