Оптимальная алгоритмизация

164
14 февраля 2018, 11:38

Добрый день.

Есть алгоритм, который можно записать двумя способами. Первый способ (примеры не транслировал):

for(i=0;i!=max;++i){
if(flag==true) fun1(int); else fun2(int,double);
}
if(flag==true) fun3(int,double,float); else fun4(int,double,float,char);

Второй способ:

if(flag==true){
for(i=0;i!=max;++i) {fun1(int);}
fun3(int,double,float);
}
else{
for(i=0;i!=max;++i) {fun2(int,double);}
fun4(int,double,float,char);
}

Оба эти способа имеют недостатки:

В первом способе есть потери быстродействия, так как условие проверяется каждый раз в цикле.

Во втором способе два раза повторяется цикл. Это плохо, так как при изменении параметров цикла (например параметра max), придется править в двух местах и легко забыть, что надо поправить и в другом цикле.

Вопрос:

  1. Как надо сделать, чтобы и потерь быстродействия не было, и править надо было в одном месте. Не городить же ради такого простого дела шаблоны цикла с переменным числом параметров.

Спасибо.

UPD1:

Коллеги приводят разные варианты решений этого конкретного примера. Но вопрос не в этом конкретном примере. Вопрос как решать общий случай. Для этого конкретного примера оптимальное решение такое (назовем его третий вариант, пример не транслировал):

class T1{
public:
run1(){fun1(int);}
run2(){fun3(int,double,float);}
};
class T2{
public:
run1(){fun2(int,double);}
run2(){fun4(int,double,float,char);}
};
template<class T> alg(T t){
for(i=0;i!=max;++i) {t.run1();}
t.run2();
};
main(){
T1 t1;
T2 t2;
if(flag==true){
alg<T1>(t1);
}
else{
alg<T2>(t2);
}
}

в этом третьем варианте нет проверки внутри цикла и вместе с тем если надо править параметры цикла, то править придется только в одном месте - в шаблонной функции alg. Но решение получилось слишком многословным для такой пустяковой задачи. Нужен более общий подход.

Answer 1

Честно говоря не уверен, но думаю функтор облегчит выполнение

// функции для проверки
void f1() {std::cout << 1 << '\n';}
void f2() {std::cout << 2 << '\n';}
void f3() {std::cout << 3 << '\n';}
void f4() {std::cout << 4 << '\n';}
class Fun  {
    int k;
public:
    Fun(int max) : k(max) {}
    void operator ()(bool b = false) {   // inline
        int n = k;
        if(b) {
            while(n--)  f1();
            f3();
        }
        else {
            while(n--)  f2();
            f4();
        }
    }
};
int main()
{  
    Fun obj(3);
    obj();
    obj(1);
    return 0;
}

не уверен, потому что не знаю цель вашей задачи, и еще можно функции содержать в классе как статические закрытые члены

READ ALSO
Spring Security и группы ролей

Spring Security и группы ролей

Здравствуйте, за ранее извиняюсь за, возможно, нубский вопрос, но всё жеРазбираюсь с spring security, для своего приложения выполнил классическую...

194
Привести к типу Integer [требует правки]

Привести к типу Integer [требует правки]

как можно привести к типу integer

140
Железобетонный random java

Железобетонный random java

Пишу небольшую игру, в ней генерируется случайное число, от этого числа зависит весь исход уровня, те надо его максимально рандомизировать,...

164
Использование FileWriter в цикле

Использование FileWriter в цикле

В main создал файл OutputВ него записываю данные через отдельную функцию

134