Russian Qt Forum
Ноябрь 22, 2024, 01:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вложенные циклы  (Прочитано 9860 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 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++ ?

Спасибо
Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #1 : Сентябрь 16, 2021, 12:26 »

Подойдут, возможно, ranges + join.
https://en.cppreference.com/w/cpp/ranges/join_view
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 16, 2021, 15:08 »

Подойдут, возможно, ranges + join.
https://en.cppreference.com/w/cpp/ranges/join_view
Прочитал справочник, по-моему это посвящено др случаю (тоже не раз встречался). А здесь я вынес все циклы в метод в который подаю std::function. Не бог весть что, но приятнее
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Сентябрь 17, 2021, 10:55 »

Можно попробовать самому написать функцию, которая будет принимать контейнер и функтор
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #4 : Сентябрь 21, 2021, 00:46 »

По теории алгоритмов любое число вложенных циклов можно преобразовать в 2 вложенных цикла.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 21, 2021, 10:51 »

По теории алгоритмов любое число вложенных циклов можно преобразовать в 2 вложенных цикла.
Прошу исполнить  Улыбающийся
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #6 : Сентябрь 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;
}
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 22, 2021, 12:21 »

Несерьезно
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #8 : Сентябрь 22, 2021, 14:50 »

Несерьезно
Вместо qDebug делай шо хош. Значения i,j,k,l как в четверном цикле.
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #9 : Сентябрь 22, 2021, 14:54 »

По непрямоугольному массиву будет 2 вложенных цикла.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 22, 2021, 15:25 »

Вместо qDebug делай шо хош. Значения i,j,k,l как в четверном цикле.
Та ну нафиг такое "кодирование". Еще и пишете без пробелов  Плачущий

По непрямоугольному массиву..
Не знаю такого "непрямоугольного"  Непонимающий
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #11 : Январь 11, 2022, 14:50 »

хотелось бы "поызячнее"

не вразумел.
чего-чего хочется?
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #12 : Январь 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...
не знаю, как быть с итераторами, особенно, если они разной природы...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Январь 13, 2022, 12:05 »

Если у нас есть многомерный массив, скажем int a[5][3][4]
...
не знаю, как быть с итераторами, особенно, если они разной природы...
C массивом легко оформить ф-цией/методом, но это случай редкий, обычно перебираемые контейнеры самые разные.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 22.