Suppose we've got a std::valarray<unsigned> bar and want to iterate over each std::valarray<unsigned> foo with 1 <= foo[i] <= bar[i].
We can do so, if we first create all such foo:
std::forward_list<std::valarray<unsigned>> make_foo_list(std::valarray const& bar)
{
std::forward_list<std::valarray<unsigned>> foo_list;
build_foo_list(foo_list, std::valarray<unsigned>(bar.size()), 0);
return foo_list;
}
void build_foo_list(std::forward_list<std::valarray<unsigned>>& foo_list, std::valarray const& bar, std::valarray<unsigned> foo, std::size_t i)
{
for (std::size_t t = 1; t <= bar[i]; ++t)
{
foo[i] = t;
if (i < bar.size() - 1)
build_foo_list(foo_list, bar, foo, i + 1);
else
foo_list.push_front(foo);
}
}
Then, we can iterate over the created list. However, I don't like this approach for two reasons: First, I don't want to waste memory for storing these elements. And second, it's not really a beautiful solution.
So, can we do better?
Aucun commentaire:
Enregistrer un commentaire