diff --git a/src/polymesh/iterators.hh b/src/polymesh/iterators.hh
index 5ffc7e18e451ddd5c795de2eb7460d10d916cc95..75fcac90513a40fc5e63a373531860f37321527d 100644
--- a/src/polymesh/iterators.hh
+++ b/src/polymesh/iterators.hh
@@ -102,6 +102,12 @@ struct attribute_iterator : smart_iterator<attribute_iterator<AttributeT>>
 template <class IteratorT, class PredT>
 struct filtering_iterator final : smart_iterator<filtering_iterator<IteratorT, PredT>>
 {
+    filtering_iterator(IteratorT it, PredT p) : it(std::forward<IteratorT>(it)), pred(std::forward<PredT>(p))
+    {
+        if (it.is_valid())
+            advance(); // skip initially false elements
+    }
+
     IteratorT it;
     PredT pred;
 
diff --git a/src/polymesh/ranges.hh b/src/polymesh/ranges.hh
index 9a6b7befaab723def05a48446205dca75b078e1c..27f392c0591412b3e4d08e03a4b5c7df7ae9b74f 100644
--- a/src/polymesh/ranges.hh
+++ b/src/polymesh/ranges.hh
@@ -185,6 +185,8 @@ struct filtered_range : smart_range<filtered_range<ElementT, RangeT, PredT>, Ele
 {
     using IteratorT = decltype(std::declval<RangeT>().begin());
 
+    filtered_range(IteratorT it, PredT p) : it_begin(std::forward<IteratorT>(it)), pred(std::forward<PredT>(p)) {}
+
     filtering_iterator<IteratorT, PredT> begin() const { return {it_begin, pred}; }
     end_iterator end() const { return {}; }