Warum bieten Container " begin
" / " end
" Iteratoren an, während Algorithmen " first
" / " last
" Iteratoren wollen?
Zum Beispiel:
vector
bietet .begin()
und .end()
( cppreference.com , cplusplus.com ).
sort
möchte Parameter first
und last
( cppreference.com ) , cplusplus.com ).
Bearbeiten: Eine noch größere Diskrepanz gefunden. Es sind nicht nur Algorithmen , die " first
/ last
" verwenden, sondern auch Container-Konstruktoren (wie vector(first, last, ...)
).
Ich habe alle Container und Algorithmen nicht überprüft, aber ein paar mehr und alle angebotenen Container überprüft begin
/ end
und alle gewünschten Algorithmen first
/ last
(oder Variationen wie first1
und first2
).
Gibt es einen guten Grund dafür? Für mich wäre es sinnvoller, wenn sie alle gleich wären. Vorzugsweise begin
und end
, da ich last
nicht mag, weil das inklusive klingt aber nicht ist. Für Algorithmen würde es einfach bedeuten, dass der Anfang und das Ende des Bereichs verarbeitet werden, so wie es jetzt zuerst und zuletzt gemeint ist.
Der Grund liegt wahrscheinlich in der Vergangenheit: So nannten sie Stepanov und Lee, die ersten Implementierer von STL, die später zur C ++ - Standardbibliothek wurden.
Hier ist Stepanovs Artikel über STL . Page 47 beschreibt sort
%Vor% beschreibt die Containeroperationen begin()
und end()
.
Beachten Sie, dass zusätzlich zu begin
/ first
und end
/ last
die C ++ - Standardbibliothek die optionalen Sequenzoperationen front()
und back()
beschreibt. Der Unterschied in der Benennung ist hier leicht zu verstehen, da die Operationen für denselben Container verfügbar sein müssen und back()
inklusive ist.
first
und last
können zwei beliebige Iteratoren sein, solange last
nicht "vor" first
ist. Sie müssen nicht Anfang und Ende eines Containers sein.
Es wäre noch verwirrender, wenn Container und Algorithmen sie auf die gleiche Weise benennen würden. Der ganze Sinn von Algorithmen, die Iteratoren verwenden, besteht darin, dass sie nicht die begin
und end
eines Containers sein müssen, sondern sie können beliebige Iteratoren sein. Die Tatsache, dass Sie als Benutzer für die Übergabe eines sinnvollen Paares von first
und last
Iterator verantwortlich sind, unterstreicht die unterschiedlichen Namen der Schnittstellen.
Andererseits ist es ein Schwachpunkt von Algorithmen, dass sie keine Methoden anbieten, die einen Container als Parameter verwenden, wenn Sie in den meisten Fällen einfach den Algorithmus von begin
bis end
eines Iterators arbeiten lassen wollen.
Tags und Links c++