Myślę, że Boost.Range też zasługuje na wzmiankę. Wynikowy kod jest bardzo zbliżony do oryginału:
#include <boost/range/adaptors.hpp>
using boost::adaptors::filtered;
auto filteredElements = elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; });
Jedynym minusem jest jawne zadeklarowanie typu parametru lambdy. Użyłem decltype (elements) :: value_type, ponieważ pozwala to uniknąć konieczności przeliterowania dokładnego typu, a także dodaje ziarno ogólności. Alternatywnie, w przypadku polimorficznych lambd C ++ 14 typ można po prostu określić jako auto:
auto filteredElements = elements | filtered([](auto const& elm)
{ return elm.filterProperty == true; });
FilterElements byłby zakresem odpowiednim do przechodzenia, ale jest to w zasadzie widok oryginalnego kontenera. Jeśli potrzebujesz kolejnego kontenera wypełnionego kopiami elementów spełniających kryteria (tak, aby był niezależny od czasu życia oryginalnego kontenera), może to wyglądać następująco:
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
ustawione natrue
?