C ++ "select" -Algorithmus

8

Unter den Funktionen, die in std::algorithm zu finden sind, finde ich eines der grundlegendsten, die ich mir vorstellen kann: eine Teilmenge einer Sammlung auswählen (z. B. alle ungeraden Zahlen zurückgeben, alle Angestellten mit Status) == "Angestellt", alle Artikel, die weniger als 20 Dollar kosten).

Also, eine Liste von Ints wie

gegeben %Vor%

Wie finden Sie diejenigen, die gerade sind und diejenigen, die größer als 7 sind?

    
pistacchio 26.02.2016, 15:46
quelle

3 Antworten

17

Zum Beispiel

%Vor%

Hier ist ein Demonstrationsprogramm

%Vor%

Seine Ausgabe ist

%Vor%     
Vlad from Moscow 26.02.2016, 15:50
quelle
19

Wenn Sie etwas Funktionelleres wollen, können Sie sich die Boost-Range-Bibliothek ansehen. Insbesondere filtered :

%Vor%

Dies gibt Ihnen eine träge Ansicht, ohne einen neuen Container zu erstellen.

Sie können dasselbe von Eric Nieblers range-v3 erhalten:

%Vor%

mit dem Vorteil, dass Sie das auch einem Vektor zuweisen können (damit Sie wählen können, ob es faul oder eifrig ist, was Boost.Ranges nicht zulässt).

%Vor%     
Barry 26.02.2016 16:00
quelle
1

Abhängig von Ihren genauen Anforderungen sollten Sie std::stable_partition (oder std::partition ) berücksichtigen. Es ordnet Elemente in dem Bereich so an, dass alle, die ein Prädikat erfüllen, zuerst kommen. Sie können sich das so vorstellen, dass Sie den Bereich in einen "Teilsatz" und einen "Nicht Teilmengen" Teil aufteilen. Hier ist ein Beispiel:

%Vor%

Wenn Sie jedoch jedes übereinstimmende Element in eine neue Sammlung kopieren möchten, z. B. weil der Quellbereich nicht geändert werden soll, verwenden Sie std::copy_if .

Vielleicht suchen Sie wirklich nach einer Ansicht eines nicht änderbaren Bereichs. In diesem Fall nähern Sie sich dem Problem aus der falschen Richtung. Sie benötigen keinen bestimmten Algorithmus. Eine natürlichere Lösung für das Problem wäre ein Filter Iterator , wie zum Beispiel Filter-Iterator von Boost . Sie können das in Boost verwenden oder seine Implementierung studieren, um zu lernen, wie Sie Filter-Iteratoren selbst schreiben können.

    
Christian Hackl 26.02.2016 16:16
quelle

Tags und Links