2016-03-08 17 views
6

ich bemerkt habe gibt es 2 Möglichkeiten, um das Ende Iterator eines Vektors (oder eine andere Container-Klasse) zu erhalten:Unterschied zwischen std :: end (myVector) und myVector.end()

std::end(myVector) 

und

myVector.end() 

Das gleiche gilt für verschiedene andere Behälter Iterator Funktionen, begin, cend, cbegin, rend, rbegin, crend, crbegin, find usw. Was ich bin frage mich, ob es einen funktionalen Unterschied zwischen diesen gibt? Und wenn nicht, gibt es einen historischen Grund, beide zu haben?

(Entschuldigt, wenn dies ein Duplikat ist, habe ich überall gesucht, und viele Quellen für die eine oder andere dieser Methoden gefunden, aber keine, die die beiden beiden oder vergleicht erwähnt.)

Antwort

7

Es gibt Ein historischer Grund: Vor C++ 11 gab es nur die Versionen der Mitgliedsfunktionen. C++ 11 hat die Nicht-Member hinzugefügt, die auch für reine C-artige Arrays funktionieren, und kann daher als allgemeiner betrachtet werden.

int a[] = {3, 1, 5, 67, 28, -12}; 
std::sort(std::begin(a), std::end(a)); 

Wenn auf Standardbibliothek Behälter angewandt, die Wirkung von std::begin und std::end ist der begin() und end() Elementfunktionen des Behälters zu nennen, so dass es kein funktioneller Unterschied.

C++ 14 hinzugefügt std::cbegin, std::cend, , std::rend, std::crbegin und std::crend, mit ähnlichem Verhalten.

+0

So ist der einzige Unterschied ist die neue Methode funktioniert auch auf Arrays? Okay. Nützlich, schätze ich - ich muss vielleicht die Person fragen, die diesen Code geschrieben hat, warum wir sie auf 'vector's verwenden und den Code unnötig überflüssig machen, aber ich denke, das beantwortet meine Frage. –

+0

@DarrelHoffman Ich denke, es ist eine Frage der Wahl, aber ich bevorzuge, wenn möglich, Nichtmitgliedsfunktionen zu verwenden. Wenn der Parameter ein Standard-Bibliothekscontainer ist, kann "std ::" weggelassen werden, und "begin (v)" ist nicht viel ausführlicher als "v.begin()". – juanchopanza

+0

Ja, obwohl gefährlich möglicherweise in diesem Fall - Ein großer Teil unserer Code-Basis wird von vielen Teams in verschiedenen Teilen der Welt geteilt, für Legacy-Gründe, von denen einige noch C++ 0x ausgeführt werden. Ich erwarte nicht, dass dieser spezielle Teil des Codes Probleme verursacht, aber es gab in der Vergangenheit Konflikte darüber. (Wir haben bestimmte Klassen zu markieren, wie "No C++ 11 erlaubt", so dass es nicht andere Teams nicht bricht baut ...) –

Verwandte Themen