Я думаю, что упоминания заслуживает и Boost.Range . Полученный код довольно близок к оригиналу:
#include <boost/range/adaptors.hpp>
using boost::adaptors::filtered;
auto filteredElements = elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; });
Единственным недостатком является необходимость явного объявления типа параметра лямбда. Я использовал decltype (elements) :: value_type, потому что он избегает указывать точный тип, а также добавляет зерно универсальности. В качестве альтернативы, с полиморфными лямбдами C ++ 14 тип можно просто указать как auto:
auto filteredElements = elements | filtered([](auto const& elm)
{ return elm.filterProperty == true; });
filterElements - это диапазон, подходящий для обхода, но в основном это представление исходного контейнера. Если вам нужен другой контейнер, заполненный копиями элементов, удовлетворяющих критериям (чтобы он не зависел от времени жизни исходного контейнера), он мог бы выглядеть так:
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
установлено значениеtrue
?