Con un paio di aggiunte il codice diventa:
(Ho cambiato da Predicate a Filter perché i predicati per convenzione restituiscono un boolean)
class Filter {
    public:
        Filter(uint32_t min, uint32_t max, std::vector<std::vector<uint32_t>>& mat) noexcept
            : p_min(min), p_max(max), p_mat(mat)  {}
       // sposta i dati necessari
        Filter(Filter&& p) noexcept : p_mat(p.p_mat) , temp(std::move(p.temp)) {  }
       // finalizza l'inserimento
        ~Filter() {
           // se ci sono almeno due elementi...
            if (temp.size()>=2) {
                p_mat.emplace_back(std::move(temp));
            }
        }
        void operator()(uint32_t val) {
            if (val >= p_min && val <= p_max) {
                temp.emplace_back(val);
            }
        }
    private:
        std::vector<uint32_t> temp;
        std::vector<std::vector<uint32_t>>& p_mat;
        uint32_t p_min=0;
        uint32_t p_max=0;
};
int main()
{
    vector<unsigned int> v = { 1, 3, 5, 6, 7, 8 };
    vector<vector<uint32_t>> w;
    std::for_each(v.cbegin(), v.cend(), Filter{0,2, w });
    std::for_each(v.cbegin(), v.cend(), Filter{3,5, w });
    std::for_each(v.cbegin(), v.cend(), Filter{6,8, w });
    std::for_each(w.cbegin(), w.cend(), [](auto& v) {
        std::for_each(v.cbegin(), v.cend(), [](auto val) {
            std::cout << val << " ";
        });
        std::cout << "\n";
    });
    cin.get();
}
Se i limiti delle sotto sequenze fossero sempre noti a compile time si potrebbe trasformare il tutto in un template, ma è una "raffinatezza" non necessaria al momento.