Я думаю, що 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; });
filteredElements був би діапазоном, придатним для обходу, але в основному це вигляд оригінального контейнера. Якщо вам потрібен інший контейнер, заповнений копіями елементів, що відповідають критеріям (щоб він не залежав від терміну служби оригінального контейнера), це може виглядати так:
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
?