27

Ich habe diesen CodeWas sagt der C++ Standard über std :: vector <int> v1, v2; std :: Abstand (v1.begin(), v2.begin())?

#include <vector> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::vector<int> v1,v2; 
    std::cout << std::distance(v1.begin(),v2.begin()); 
    return 0; 
} 

und es hat einen Fehler, weil es nicht sinnvoll ist, die Iteratoren von zwei verschiedenen Vektoren zu vergleichen.

hatte ich einen Blick auf N3376 bei 24.4.4 Iterator Operationen auf Seite 815:

template<class InputIterator> 
typename iterator_traits<InputIterator>::difference_type 
distance(InputIterator first, InputIterator last); 

Benötigt: Wenn InputIterator die Anforderungen der Random Access Iterator erfüllt, last wird von erreichbar sein first oder first soll erreichbar von last sein; andernfalls muss last von first erreichbar sein.

Jetzt denke ich, dass Erfordert nicht erfüllt ist.

Was soll der Standardzustand in diesem Fall sein?

+0

Wenn es nicht standardmäßig erlaubt ist, wird es höchstwahrscheinlich zu undefiniertem Verhalten führen, weil es unlogisch ist, Iteratoren verschiedener Vektoren zu vergleichen – Creris

+2

Im Allgemeinen führt das Brechen einer Anforderung zu undefiniertem Verhalten. –

Antwort

28

[iterator.requirements.general]:

Ein Iterator j wenn erreichbar aus einem Iterator i genannt wird und nur wenn es eine endliche Folge von Anwendungen des Ausdrucks ++i die i == j macht .

Das Problem ist, dass, sobald Sie v1.begin()v1.size()-1 mal erhöht, die nächste Inkrementbetrieb undefiniertes Verhalten induziert, so v2.begin() nicht von v1.begin() zu erreichen. Das gleiche Argument macht v1.begin() unerreichbar von v2.begin().


Falls Ihre Frage lautete: "Was passiert, wenn ein Zustand, in einem Benötigt Abschnitt verletzt wird?", Blick auf [res.on.required]:

Verletzung der Voraussetzungen festgelegt in einer der Funktion Benötigt: Absatz führt zu undefiniertem Verhalten, wenn die der Funktion löst: eine Ausnahme Absatz legt fest, zu werfen, wenn die Voraussetzung dafür ist, verletzen d.

3

Die requires wird nicht erfüllt, was bedeutet, dass der Code undefiniertes Verhalten hat: Alles könnte passieren.

3

In diesem Fall wird undefiniert Verhalten. Weil last nicht erreichbar ist von first durch (möglicherweise wiederholtes) Inkrementieren first.

5

In einigen Implementierungen von wird der erste Iterator inkrementiert, bis er den zweiten Iterator erreicht. Die Iterationen werden gezählt:

unsigned int counts = 0; 
while (iter1 != iter2) 
{ 
    ++counts; 
    ++iter1; 
} 

Wenn die Iteratoren Behälter in unterschiedlichen Adreßräumen Punkt wird die Schleife viele nicht beenden. Unter Verwendung der Begriffe im Standard ist der zweite Iterator nicht erreichbar.