STL: Schreiben des "where" Operators für einen Vektor

8

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:

%Vor%     
Arman 08.06.2010, 17:03
quelle

5 Antworten

10

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.

    
Crazy Eddie 08.06.2010, 17:14
quelle
3

Sie könnten eine vorhergesagte Version von transform verwenden, wenn es eine gab. Es gibt keins, aber es ist sehr einfach zu schreiben:

%Vor%

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:

%Vor%

Schließlich benötigen Sie ein Gizmo, das transform_if verwendet, um eine Objektreferenz in einen Objektzeiger umzuwandeln. Überraschung, Überraschung, einfach zu schreiben ...

%Vor%

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.

%Vor%

BEARBEITEN:

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 ...

%Vor%     
John Dibling 08.06.2010 18:09
quelle
1

Dies scheint ein Problem zu sein, das viel einfacher in einer deklarativen Sprache wie Prolog gelöst werden kann. Ich habe es trotzdem in C ++ versucht:

%Vor%     
Job 08.06.2010 17:36
quelle
0

Ich bin nicht sicher, welche Indizes Sie wollen. Ist das, was Sie versuchen zu erreichen?

%Vor%     
Naveen 08.06.2010 17:27
quelle
0
%Vor%

Überladen Sie zusätzliche Argumente für Funktionsobjekte, wie Sie möchten. Verwenden Sie:

%Vor%

Noah Roberts Lösung ist nett, aber ich bin mir nicht ganz sicher, wie ich das schaffen könnte.

    
Puppy 08.06.2010 17:56
quelle

Tags und Links