Ich denke, Boost.Range verdient auch eine Erwähnung. Der resultierende Code kommt dem Original ziemlich nahe:
#include <boost/range/adaptors.hpp>
using boost::adaptors::filtered;
auto filteredElements = elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; });
Der einzige Nachteil ist, dass der Parametertyp des Lambda explizit deklariert werden muss. Ich habe decltype (elements) :: value_type verwendet, weil es nicht erforderlich ist, den genauen Typ zu buchstabieren, und außerdem ein Körnchen der Generizität hinzufügt. Alternativ könnte der Typ mit den polymorphen Lambdas von C ++ 14 einfach als auto angegeben werden:
auto filteredElements = elements | filtered([](auto const& elm)
{ return elm.filterProperty == true; });
gefilterte Elemente wären ein Bereich, der zum Durchqueren geeignet ist, aber im Grunde ist es eine Ansicht des ursprünglichen Containers. Wenn Sie einen anderen Container benötigen, der mit Kopien der Elemente gefüllt ist, die die Kriterien erfüllen (so dass er unabhängig von der Lebensdauer des Originalcontainers ist), könnte dies folgendermaßen aussehen:
using std::back_inserter; using boost::copy; using boost::adaptors::filtered;
decltype(elements) filteredElements;
copy(elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; }), back_inserter(filteredElements));
filterProperty
eingestellt sindtrue
?