Wie erhält man den Index eines Elements aus einem Prädikat, das an einen STL-Algorithmus übergeben wurde?

8

Sagen wir, ich habe einen Vektor von Elementen und ein Maskenarray, und ich möchte Elemente aus dem Vektor mit dem wahren entsprechenden Maskenwert extrahieren, um den Vektor zu trennen. Gibt es eine Möglichkeit, std::copy_if für diesen Zweck zu verwenden? Das Problem ist, ich habe nur value von Element innerhalb Prädikat, nicht Iterator zu ihm, so dass ich nicht den tatsächlichen Index zu Adresse Maskenarray kennen kann.

Ich kann Adressen direkt wie folgt manipulieren:

%Vor%

Ich finde jedoch, dass dies eine hässliche Lösung ist. Irgendwelche besseren Ideen?

Aktualisieren : Eine weitere mögliche Lösung ist die Verwendung eines externen Iterators für die Maske:

%Vor%

Diese Lösung erfordert jedoch zusätzliche Variablen im äußeren Namensraum, was immer noch nicht wünschenswert ist.

    
Mikhail 28.02.2012, 11:09
quelle

2 Antworten

5

Ok, nach ein wenig Nachforschung komme ich mit dem ersten Beispiel aus dem einfachsten Weg heraus. Man sollte jedoch nicht vergessen, den Wert in Lambda durch (const) reference zu übergeben, um die Adresse der lokalen Kopie eines Parameters nicht zu übernehmen:

%Vor%     
Mikhail 15.03.2012, 16:43
quelle
1

Sie könnten mehrere Iteratoren von Boost kombinieren (nicht wirklich getestet, aber mit GCC 4.6 kompiliert):

%Vor%

Ich denke jedoch, eine explizite Schleife ist hier einfach einfacher.

Hier ist eine weitere verallgemeinerte Version des obigen Codes, diesmal sogar getestet :) Es bietet Implementierungen für Python-ähnliche Funktionen map , filter und enumerate . Dieser benötigt GCC 4.7.

%Vor%

Wenn Sie keine Vektoren verwenden müssen, wird die Lösung etwas langweilig:

%Vor%     
Philipp 28.02.2012 12:03
quelle