Ich muss die Indizes im Vektor anhand mehrerer boolescher Prädikate finden.
ex:
%Vor% Wie deklariert man **where**
function, um die verschiedenen benutzerdefinierten booleschen Funktionen über den Vektor zu benutzen?
danke Arman.
Nach einer Woche bearbeiten
Ich habe einige komplexe Lösungen mit Vorlagen gemacht. Aber in Wirklichkeit kann man bereits vordefinierte valarray
für meine Aufgaben verwenden. Hier ist das Code-Snippet, vielleicht kann man es nützlich finden:
Machen Sie Ihre bool_xxx-Funktionen tatsächlich zu Funktoren eines bestimmten Typs (Tag-Dispatching wäre genug). Dann überschreibe || und & amp; & amp; für sie so, dass diese Operatoren ein bool_and oder bool_or zurückgeben. Dann können Sie Ihre Bool_ Prädikate wie folgt verwenden:
%Vor%Wenn Sie versucht sind, eine "where" -Funktion zu schreiben, dann möchten Sie das anscheinend mehr als einmal mit einem anderen Satz von bool_xxx-Funktionen tun. Selbst wenn du weißt, dass du jetzt eine bestimmte Art von Komposition willst, kannst du es genauso universell wie möglich machen. So würde ich es machen.
Bearbeiten:
Basierend auf diesem Kommentar: @Jerry: Zum Beispiel muss ich wissen: id = wo (v & lt; 10.0 & amp; & amp; v & gt; 1.0); und irgendwo später würde ich gerne wissen: id = wo (v & lt; fun (v)); mit boost :: lambda:
ist es vielleicht besser %Vor%Oder, wenn Sie Lambda hassen oder es nicht benutzen dürfen ... oder einfach nur eine etwas nettere Syntax wollen (aber nicht direkt Funktionen verwenden können), dann erstellen Sie einfach Ihren eigenen Platzhaltertyp und überschreiben ihn, um Bool_xxx-Funktoren zurückzugeben auf Operatoren & lt ;, & gt; usw. ...
Edit2: Hier ist ein ungetestet, wo ein Vektor von Iteratoren an alle Objekte zurückgegeben wird, die übereinstimmen:
%Vor%Es ist rekursiv und könnte bei einigen Implementierungen langsam sein, aber es gibt einen Weg, es zu tun.
Sie könnten eine vorhergesagte Version von transform
verwenden, wenn es eine gab. Es gibt keins, aber es ist sehr einfach zu schreiben:
Dann würden Sie einen Weg brauchen, um aus mehreren Prädikaten zusammengesetzt zu werden, so dass Sie etwas wie find_if( begin, end, condition1 && condition2 )
ausdrücken könnten. Das ist wiederum einfach zu schreiben:
Schließlich benötigen Sie ein Gizmo, das transform_if
verwendet, um eine Objektreferenz in einen Objektzeiger umzuwandeln. Überraschung, Überraschung, einfach zu schreiben ...
Lasst uns das alles mit einem konkreten Beispiel zusammensetzen. Gizmo
unter ist das Objekt, von dem Sie eine Sammlung haben. Wir haben 2 Prädikate find_letter
und find_value
, nach denen wir in unserem Hauptteil vector
suchen wollen. transform_if
ist die Prädikatversion von transform
, get_ptr
konvertiert eine Objektreferenz in einen Zeiger und binary_composite
führt die beiden Kompositen zusammen.
Basierend auf sbi iterativen Ansatz , hier ist eine prädizierte Version von copy
, die mehr dem allgemeinen STL-Paradigma entspricht und mit back_insert_iterator
verwendet werden kann, um das zu erreichen, was in diesem Fall gewünscht ist. Es wird Ihnen ein vector
des Objekts geben, nicht Iteratoren oder Indizes, also ist das transform_if
I, das oben gepostet wurde, immer noch besser für diese Verwendung als copy_if
. Aber hier ist es ...