Warum hat die Standardbibliothek find und find_if?

8

Konnte nicht find_if nur eine Überladung von find sein? So machen std::binary_search und Freunde es ...

    
Billy ONeal 20.08.2010, 17:16
quelle

4 Antworten

14

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:

%Vor%

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.

    
GManNickG 20.08.2010, 17:25
quelle
3

Hier ist, was Stroustrup sagte (Die Programmiersprache C ++, 18.5.2):

  

Wenn find() und find_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).

    
T.E.D. 20.08.2010 17:32
quelle
1

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:

%Vor%

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.

    
Mark B 20.08.2010 17:32
quelle
-2

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.

    
Timo Geusch 20.08.2010 17:32
quelle

Tags und Links