Konnte nicht find_if
nur eine Überladung von find
sein? So machen std::binary_search
und Freunde es ...
Ein Prädikat ist eine gültige Sache, die man finden kann, damit man zu Mehrdeutigkeiten kommen kann.
Betrachte find_if
wird umbenannt in find
, dann hast du:
Was soll dann gemacht werden mit:
%Vor% Anstatt zu versuchen, eine gewundene Lösung zu finden, um basierend auf x
zu unterscheiden (was nicht immer möglich ist *), ist es einfacher, sie einfach zu trennen.
* Das wäre mehrdeutig, egal was dein Schema ist oder wie mächtig es sein könnte †:
%Vor%† Rette Gedankenlesen.
Hier ist, was Stroustrup sagte (Die Programmiersprache C ++, 18.5.2):
Wenn
find()
undfind_if()
die gleicher Name, überraschende Abneigungen hätte ergeben. Im Allgemeinen, die_if
suffix wird verwendet, um dies anzuzeigen Ein Algrithm nimmt ein Prädikat.
Was genau diese "Mehrdeutigkeit" ist, antwortete Steve Jessop, dass in seiner (am besten bewerteten) Antwort auf diese SO-Frage .
(Anmerkung: diese Frage kann tatsächlich als die gleiche Frage wie diese zu qualifizieren. Ich bin nicht ganz schlau genug in C ++ arcania zu entscheiden).
Es kann nicht den gleichen Namen haben, weil es eine Mehrdeutigkeit geben würde. Angenommen, wir hätten eine find
overload anstelle von find_if
. Dann nehme an:
Das find
hätte keine Möglichkeit, die Inkonsistenz zu beheben: Sollte es versuchen, das finder
im Container zu finden, oder verwenden Sie das finder
, um den Suchvorgang durchzuführen? Um dieses Problem zu lösen, haben sie zwei Funktionsnamen erstellt.
Sie können find
in find_if
mit einer Art Gleichheitsprädikat implementieren.
Ich würde vermuten, dass der wahre Grund darin besteht, dass Sie find
relativ einfach implementieren und spezialisierte spezialisierte Implementierungen für typische auftretende Typen bereitstellen können; Wenn Sie find_if
verwenden, kann das übergebene Prädikat beliebig komplex sein, was dem Bibliotheksimplementierer weniger Spielraum für die Optimierung gibt.
Außerdem hat C ++ die Philosophie "Sie zahlen nicht für das, was Sie nicht verwenden" und normalerweise erwarten Sie, dass Sie nicht für eine Prädikatauswertung bezahlen wollen, wenn ein einfacher Vergleich ausreicht.
Tags und Links c++ stl std design-rationale