Это приводит к двум случаям кода:
Код: Выделить всё
struct vec2f {
float x, y;
};
void each_to_each(std::vector& vec)
{
std::for_each(std::begin(vec), std::end(vec), [&]([[maybe_unused]] const auto& pos1) {
const auto it = std::begin(vec) + (&pos1 - std::data(vec));
std::for_each(it + 1, std::end(vec), [&]([[maybe_unused]] const auto& pos2) {
// Some actions with pos1 and pos2 (like particles interaction)
});
});
}
void each_to_each_symmetrical(std::vector& vec)
{
std::for_each(std::begin(vec), std::end(vec), [&]([[maybe_unused]] const auto& pos1) {
std::for_each(std::begin(vec), std::end(vec), [&]([[maybe_unused]] const auto& pos2) {
if (&pos1 == &pos2) {
return;
}
// Some actions with pos1 and pos2 (like particles interaction)
});
});
}
Итак, типичный способ избежать этого — поместить эти циклы в обертку:
Код: Выделить всё
template
void each_to_each_with_functor(std::vector& vec, Functor fn)
{
std::for_each(std::begin(vec), std::end(vec), [&](const auto& pos1) {
const auto it = std::begin(vec) + (&pos1 - std::data(vec));
std::for_each(it + 1, std::end(vec), [&](const auto& pos2) {
fn(pos1, pos2);
});
});
}
void foo([[maybe_unused]]const vec2f& pos1, [[maybe_unused]] const vec2f& pos2) {
// Some actions with pos1 and pos2 (like particles interaction)
}
Моя идея состоит в том, чтобы реализовать для него своего рода итератор и обертку, которая будет инкапсулировать обработку вложенных циклов (с парой итераторов) и которая будет иметь возможность работать в одноуровневом цикле для разработчика.
Итак, использование должно быть таким:
Код: Выделить всё
std::vector vec;
NestedLoopIterator loop = NestedLoopIterator(vec.begin(),vec.end());
std::for_each(loop.begin(), loop.end(), [&](const auto& its) {
const vec2f& pos1 = its.it1;
const vec2f& pos2 = its.it2;
// Some actions with pos1 and pos2 (like particles interaction)
});
Во избежание изобретения велосипеда, известна ли реализация такого итератора?
Если нет, и вы видите существенные недостатки такого решения и недостатки в предлагаемом проекте проекта, поделитесь своим мнением. . Я до сих пор не уверен, хорошая ли это идея и что ее преимущества перевесят возникшую сложность.
Вот демо-версия без реализации NestedLoopIterator на данный момент.
Подробнее здесь: https://stackoverflow.com/questions/790 ... lling-in-c