2016-04-04 8 views
1

Per Dokumentation, std::find kehrtWas std :: nicht finden zurück, wenn Element nicht gefunden

letzte

, wenn kein Element gefunden wird. Was bedeutet das? Gibt es einen Iterator zurück, der auf das letzte Element im Container verweist? Oder gibt es einen Iterator zurück, der auf .end() zeigt, d. H. Nach außerhalb des Containers zeigt? Der folgende Code druckt 0, die kein Element des Containers ist. Also, ich denke, std::find gibt einen Iterator außerhalb des Containers zurück. Könnten Sie bitte bestätigen?

int main() 
{ 
    vector<int> vec = {1, 2,3, 1000, 4, 5}; 
    auto itr = std::find(vec.begin(), vec.end(), 456); 
    cout << *itr; 
} 

Antwort

8

last ist der Name des zweiten Parameters auf find. Es weiß nicht, welche Art von Container Sie verwenden, nur die Iteratoren, die Sie ihm geben.

In Ihrem Beispiel ist lastvec.end(), die (per Definition) nicht dereferenzierbar ist, da es ein nach dem letzten Element ist. So, indem sie es dereferencing, Sie nicht definiertes Verhalten aufrufen, die in diesem Fall manifestiert sich als Ausdruck von 0.

+0

Danke, ich verstehe es jetzt. –

+0

Allerdings sollten Sie in der Lage sein zu tun, wenn (vec.begin(), vec.end(), ...)! = Vec.end() '... – twalberg

+0

Was auch immer der Typ von vec ist, tut * (vec.end()) immer 0 zurückgeben? @First Jens @Cameron –

1

Basierend auf this Dokumentation, heißt es wörtlich:

„Rückgabewert: Iterator auf das erste Element erfüllt die Zustand oder zuletzt, wenn kein solches Element gefunden wird. "

In Ihrem Fall, es ist aus dem Vektor durch eine, .end()

2

Algorithmen gelten für Bereiche, die durch ein Paar von Iteratoren definiert ist. Diese Iteratoren werden als Argumente an den Algorithmus übergeben. Der erste Iterator zeigt auf das erste Element im Bereich und das zweite Argument auf eins nach dem Ende des Bereichs. Algorithmen, die fehlschlagen können, geben eine Kopie des Use-Iterators zurück, wenn sie fehlschlagen. Das macht std::find: Wenn es kein übereinstimmendes Element gibt, gibt es das zweite Argument zurück.

Beachten Sie, dass der vorhergehende Absatz nicht das Wort "Container" verwendet. Container haben Memberfunktionen, die Ihnen einen Bereich geben, in dem Sie die Elemente des Containers abrufen können. Es gibt jedoch auch Möglichkeiten, Iteratoren zu erstellen, die keine Verbindung zu einem Container haben.

+0

Sie verwenden keinen Container, also welchen verwenden Sie? Algorithmen oder Bereiche? @Pete Becker –

+0

@YuanWen - Die ** Spezifikation ** für den Algorithmus verwendet keine Container.Der Algorithmus kann auf den Inhalt eines Containers angewendet werden, indem er mit Iteratoren aufgerufen wird, die in den Container zeigen. Sie erhalten diese Iteratoren, indem Sie 'begin()' und 'end()' für den Container aufrufen. –

Verwandte Themen