Ленивая итерация декартова произведенияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ленивая итерация декартова произведения

Сообщение Anonymous »

У меня есть следующая функция C++ для вычисления возможных комбинаций декартова произведения:

Код: Выделить всё

template std::vector cartesianProduct(std::vector const& l, size_t n)
{
std::vector result;

if (l.empty())
return result;

auto const total{(size_t)std::pow(l.size(), n)};
result.reserve(total);

for (size_t i = 0; i < total; ++i)
{
std::vector combo(n);
size_t index{i};

for (long j = (long)n - 1; j >= 0; --j)
{
combo[j] = l[index % l.size()];
index /= l.size();
}

result.emplace_back(std::move(combo));
}

return result;
}
Да:

Код: Выделить всё

auto const combos{cartesianProduct(new_av, inputTypes.size())};

for (auto const& combo : combos)
{
if (timeout)
break;

//...
}
Я бы предпочел сделать ленивую версию функции для перебора возможностей для выполнения вычислений, потому что полное вычисление декартова произведения может занять много времени, зная, что я хочу его перебрать, но с возможностью прервать итерацию на полпути.

Код: Выделить всё

for (auto const& combo : cartesianProduct(new_av, inputTypes.size()))
{
if (timeout)
break;

//...
}
Можно ли это сделать на современном C++, и если да, то как?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/798 ... an-product
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»