Saya pikir Boost.Range juga layak disebutkan. Kode yang dihasilkan cukup mirip dengan aslinya:
#include <boost/range/adaptors.hpp>
using boost::adaptors::filtered;
auto filteredElements = elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; });
Satu-satunya downside adalah harus secara eksplisit mendeklarasikan tipe parameter lambda. Saya menggunakan dectype (elements) :: value_type karena ini menghindari harus mengeja tipe yang tepat, dan juga menambahkan butiran genericity. Alternatifnya, dengan lambda polimorfik C ++ 14, jenisnya dapat dengan mudah ditetapkan sebagai otomatis:
auto filteredElements = elements | filtered([](auto const& elm)
{ return elm.filterProperty == true; });
filteredElements akan menjadi rentang, cocok untuk traversal, tetapi pada dasarnya ini adalah tampilan penampung asli. Jika yang Anda butuhkan adalah penampung lain yang berisi salinan elemen yang memenuhi kriteria (sehingga tidak tergantung dari masa pakai penampung asli), ini akan terlihat seperti:
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
disetel ketrue
?