Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Сентябрь 15, 2021, 15:47



Название: Вложенные циклы
Отправлено: Igors от Сентябрь 15, 2021, 15:47
Добрый день

Неск раз повторяется такая этажерка (псевдокод)
Код
C++ (Qt)
for (const auto & it : m_curves) {
for (const auto & it2 : it) {
 for (const auto & it3 : it2) {
  auto * lst = it3.GetList();
  if (!lst) continue;
 
 // содержательная часть
 
Да, и итераторы могут быть const или нет. Не то чтобы великая проблема, можно перетерпеть, но хотелось бы "поызячнее". Может есть такое в современном C++ ?

Спасибо


Название: Re: Вложенные циклы
Отправлено: ksk- от Сентябрь 16, 2021, 12:26
Подойдут, возможно, ranges + join.
https://en.cppreference.com/w/cpp/ranges/join_view (https://en.cppreference.com/w/cpp/ranges/join_view)


Название: Re: Вложенные циклы
Отправлено: Igors от Сентябрь 16, 2021, 15:08
Подойдут, возможно, ranges + join.
https://en.cppreference.com/w/cpp/ranges/join_view (https://en.cppreference.com/w/cpp/ranges/join_view)
Прочитал справочник, по-моему это посвящено др случаю (тоже не раз встречался). А здесь я вынес все циклы в метод в который подаю std::function. Не бог весть что, но приятнее


Название: Re: Вложенные циклы
Отправлено: __Heaven__ от Сентябрь 17, 2021, 10:55
Можно попробовать самому написать функцию, которая будет принимать контейнер и функтор


Название: Re: Вложенные циклы
Отправлено: qtkoder777 от Сентябрь 21, 2021, 00:46
По теории алгоритмов любое число вложенных циклов можно преобразовать в 2 вложенных цикла.


Название: Re: Вложенные циклы
Отправлено: Igors от Сентябрь 21, 2021, 10:51
По теории алгоритмов любое число вложенных циклов можно преобразовать в 2 вложенных цикла.
Прошу исполнить  :)


Название: Re: Вложенные циклы
Отправлено: qtkoder777 от Сентябрь 22, 2021, 09:37
Код
C++ (Qt)
int i=1,j=1,k=1,l=1,I=3,J=3,K=3,L=3;
while(i<=I && j<=J && k<=K && l<=L)
{
qDebug()<<QString("%1 %2 %3 %4").arg(i).arg(j).arg(k).arg(l);
l=l+1;
if(l>L)
{
k=k+1;
l=1;
}
if(k>K)
{
j=j+1;
k=1;
l=1;
}
if(j>J)
{
i=i+1;
j=1;
k=1;
l=1;
}
}


Название: Re: Вложенные циклы
Отправлено: Igors от Сентябрь 22, 2021, 12:21
Несерьезно


Название: Re: Вложенные циклы
Отправлено: qtkoder777 от Сентябрь 22, 2021, 14:50
Несерьезно
Вместо qDebug делай шо хош. Значения i,j,k,l как в четверном цикле.


Название: Re: Вложенные циклы
Отправлено: qtkoder777 от Сентябрь 22, 2021, 14:54
По непрямоугольному массиву будет 2 вложенных цикла.


Название: Re: Вложенные циклы
Отправлено: Igors от Сентябрь 22, 2021, 15:25
Вместо qDebug делай шо хош. Значения i,j,k,l как в четверном цикле.
Та ну нафиг такое "кодирование". Еще и пишете без пробелов  :'(

По непрямоугольному массиву..
Не знаю такого "непрямоугольного"  ???


Название: Re: Вложенные циклы
Отправлено: _Bers от Январь 11, 2022, 14:50
хотелось бы "поызячнее"

не вразумел.
чего-чего хочется?


Название: Re: Вложенные циклы
Отправлено: Day от Январь 12, 2022, 17:19
Igors, возможно, вам понравится такая идея. Если у нас есть многомерный массив, скажем int a[5][3][4], то проход по нему можно устроить так. 
Массив представить в  линейном виде int *p = &a[0][0][0]
"Настоящий"(тройной) индекс можно представить в виде числа в смешанной с/с по основанию (5,3,4)
Арифметика представления числа в смешанной .с/с довольно проста.
И проходить цикл уже линейно
for(i=0; i<5*3*4; i++)
  ... p...
не знаю, как быть с итераторами, особенно, если они разной природы...


Название: Re: Вложенные циклы
Отправлено: Igors от Январь 13, 2022, 12:05
Если у нас есть многомерный массив, скажем int a[5][3][4]
...
не знаю, как быть с итераторами, особенно, если они разной природы...
C массивом легко оформить ф-цией/методом, но это случай редкий, обычно перебираемые контейнеры самые разные.