mardi 25 août 2015

Given a valarray

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