Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
#1

Оптимизация цикла for - C++

27.11.2015, 02:39. Просмотров 379. Ответов 14
Метки нет (Все метки)

Исходные данные: имеется цикл for, прерывание которого невозможно(должен выполнить все итерации).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int main()
{
   bool flag = false;
   
   for(int i = 0; i < 4; ++i)
   {
       if(i % 4 == 0)
       {
           flag = true;
       }
   }
   
   std::cout << flag;
}
Переприсваивание
C++
1
flag = true;
произойдет столько, сколько выполниться условие. Предусмотрена ли оптимизация для встроенных типов - игнорирование многократного присваивания одного и того же значения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2015, 02:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Оптимизация цикла for (C++):

Оптимизация цикла for - C++
Скажите, пожалуйста, как оптимизируется первый цикл? И чем он отличается от второго? Первый цикл: int a = 2; for (int i = 0; i &lt; 5;...

Оптимизация цикла по скорости - C++
Помогите пожалуйста оптимизировать данный цикл (изменить его, чтобы он выполнялся быстрее): int a = new int; int b = new int; ...

Оптимизация условия цикла while - C++
Доброго времени суток, друзья! Я еще совсем новичок в С++. Подскажите плз как оптимизировать следующее условие выхода из цикла while. Уж...

Оптимизация цикла (перебор 5000000 элементов) - C++
Можно ли как-то оптимизировать данный цикл? for (i=10000000; i&lt;15000000; i++) { for (k = i, j = 0; j &lt; 8; j++, k /= 10) ...

Применение цикла if для определения простых чисел. If внутри цикла for - C++
Доброго времени суток, подскажите пожалуйста, в чем тут дело. С кодом все хорошо, все работает, просто я пытаюсь докопаться до сути и...

Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла. - C++
Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла.

14
gru74ik
Модератор
Эксперт CЭксперт С++
4362 / 1938 / 210
Регистрация: 20.02.2013
Сообщений: 5,144
Записей в блоге: 22
27.11.2015, 06:42 #2
Хулиган, эту "оптимизацию" можно легко самостоятельно реализовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    bool flag = false;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4 && !flag)
        {
            flag = true;
        }
    }
 
    std::cout << flag;
 
    return 0;
}
Проверяем, правда ли один раз входит в тело оператора if:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    bool flag = false;
    int how_many_times = 0;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4 && !flag)
        {
            flag = true;
            ++how_many_times;
        }
    }
 
    std::cout << flag << " " << how_many_times;
 
    return 0;
}
Добавлено через 7 минут
Только для наглядности лучше количество витков цикла сделать побольше, скажем, 16 итераций, а не 4.
2
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 11:49  [ТС] #3
Цитата Сообщение от gru74ik Посмотреть сообщение
эту "оптимизацию" можно легко самостоятельно реализовать
а так можно сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    bool flag = false;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4)
        {
            static bool tmp = flag = true;
        }
    }
 
    std::cout << flag;
 
    return 0;
}
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
27.11.2015, 11:51 #4
Цитата Сообщение от Хулиган Посмотреть сообщение
C++
1
2
3
4
if(i % 4 && !flag)
{
    static bool tmp = flag = true;
}
tmp будет видна только в этом блоке, зачем ее статической делать? static - это класс хранения, другими словами, это назначение переменной времени жизни до конца работы программы. Зачем это здесь используется - не понятно.
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 11:54  [ТС] #5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
tmp будет видна только в этом блоке, зачем ее статической делать?
C++
1
2
3
4
if(i % 4)
{
     static bool tmp = flag = true;
}
присваивание tmp = flag = true, выполниться только один раз при инициализации статической переменной(я так думаю, надо проверить)
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.11.2015, 12:06 #6
Хулиган,
C++
1
2
3
4
if(min % divider == 0 || divider >= (max - min))
{
    flag = true;
}
Пойдет?

Добавлено через 3 минуты
а нет, не пойдет.
0
Erkebulan04
3 / 3 / 0
Регистрация: 20.11.2015
Сообщений: 25
27.11.2015, 21:11 #7
Цитата Сообщение от Хулиган Посмотреть сообщение
for(int i = 0; i < 4; ++i)
может быть тут меньше 5, так как ты делишь число на 4
если последний число делится на 4 то выйдет true
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 22:03  [ТС] #8
Цитата Сообщение от Erkebulan04 Посмотреть сообщение
может быть тут меньше 5, так как ты делишь число на 4
да какая вообще разница, смысл не в этом. ну и см. ответ#3

Добавлено через 47 минут
Как и ожидалось присваивание выполняется всего лишь один раз, без необходимости дополнительных условий.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
class A
{
public:
    A& operator=(const A&)
    {
        std::cout << "operator =" << std::endl;
        return *this;
    }
};
 
int main()
{
    A flag;
    A next_value;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4)
        {
            static A tmp = flag = next_value;
        }
    }
}
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
27.11.2015, 22:05 #9
Хулиган, язык сам по себе естественно никаких подобных оптимизаций не определяет.
+ пример неудачный: можно смело инициализировать flag = true и цикл будет не нужен.
0
Хулиган
27.11.2015, 22:09  [ТС]
  #10

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
можно смело инициализировать flag = true и цикл будет не нужен.
надо было массив случайных чисел взять)

0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
27.11.2015, 22:24 #11
Цитата Сообщение от Хулиган Посмотреть сообщение
Как и ожидалось присваивание выполняется всего лишь один раз
А оно того стоит? Ведь переменная больше нигде не сможет быть использованной, а жива будет, пока программа не завешится.
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 22:29  [ТС] #12
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А оно того стоит? Ведь переменная больше нигде не сможет быть использованной, а жива будет, пока программа не завешится.
Цитата Сообщение от Хулиган Посмотреть сообщение
а так можно сделать?
без понятия, поэтому и спрашиваю
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
27.11.2015, 23:00 #13
Цитата Сообщение от Хулиган Посмотреть сообщение
без понятия, поэтому и спрашиваю
если это какая-то POD-переменная, и такой цикл больше нигде или редко встречается в программе, то можно и так, конечно, но выглядит очень странно. Я бы лучше обратил внимание на пример, который предложил gru74ik.
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 23:11  [ТС] #14
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Я бы лучше обратил внимание на пример, который предложил gru74ik
ну так там выполняется лишняя проверка, которая в худшем случае удвоит время if'a, в с++ не существует ли таких конструкций, которые позволили бы выполнить только один раз кусок кода и в дальнейшем его игнорировать?
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
27.11.2015, 23:35 #15
Цитата Сообщение от Хулиган Посмотреть сообщение
в с++ не существует ли таких конструкций, которые позволили бы выполнить только один раз кусок кода и в дальнейшем его игнорировать?
Инициализация локальной статической переменной. Собственно это уже было у тебя написано кодом.
0
27.11.2015, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2015, 23:35
Привет! Вот еще темы с ответами:

вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле цикла - C++
вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле...

Нахождение отрицательного цикла в графе и вывод цикла - C++
Вот программа по нахождению отрицательного цикла в графе и вывод цикла void Floyd(int GR, int parents , int V) { int checking; int...

Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while - C++
Используя оператор цикла while, напишите программу для вычисления ниже следующей суммы. // fkdj.cpp: определяет точку входа...

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. - C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru