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.