0 / 0 / 0
Регистрация: 28.07.2018
Сообщений: 8
1

Зачем в условии цикла for минус единица?

15.08.2018, 20:36. Показов 495. Ответов 2
Метки нет (Все метки)

Всем привет.
Вообщем меня озадачила 1 задача где используется итераторы. Я с ней справился. Но написал одну вещь которую сам не могу понять(помогли с ней)
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian");
    vector<int> a;
    int b;
    while (cin >> b)
        a.push_back(b);
    for (decltype(a.begin()) m = a.begin(), s = a.begin() + 1; m != a.end() - 1; m += 2, s += 2) { // вот здесь и вопрос в условий цикла for
        cout << *m + *s;
        cout << endl;
    }
        cout << endl;
    system("pause");
    return 0;
 
}
Условие цикла for;
m != a .end() - 1
Я не понимаю зачем там -1 я попробовал убрать его программа скомпилировалась, но когда уже нажал Ctrl+Z вышла окно ошибки и там было написано
Vector iterator + offset out of range
Можете обьяснить чем важен этот -1 просто с многими циклами до этого в книге его не было.
Спасибо за понимание! Заранее благодарю))
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2018, 20:36
Ответы с готовыми решениями:

Ошибка в условии цикла
Кароч пишу крестики-нолики и тут на пути появилась непонятная ошибка int cell; if...

Присвоение в условии цикла while
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; using namespace std; void main () {...

Логическое ИЛИ в условии цикла while
Доброго времени суток. Комрады, ситуация следующая, цикл должен завершатся после введения одного...

Что значит s[j] в условии цикла for
Вот тут задан цикл с заданным числом повторений Объясните его пожалуйста,до какого условия он...

2
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
17.08.2018, 11:18 2
Попробую.. если я правильно понимаю (пусть поправят если нет):
если у вас есть вектор а, то последний элемент а.end(). Казалось бы, в условии стоит != Если бы вы просто перебирали все элементы вектора а, все было бы ок. НО!
У вас есть еще s, которое берет значение следующее после текущего! Если вы берете последний элемент в векторе а, то s уже пытается взять элемент, кторый уже за границей...
Чтобыэтого не случилось, там и стоит -1
0
Модератор
Эксперт С++
11481 / 9399 / 5649
Регистрация: 18.12.2011
Сообщений: 25,108
17.08.2018, 11:33 3
Для векторов может так и можно писать, но в общем случае нельзя.
Т.к.
а. элементы контейнера не обязаны располагаться друг за другом в памяти.
б. не все контейнеры имею итераторы произвольного доступа.

Если нужно вывести сумму двух соседних элементов лучше сделать так:
C++
1
2
3
4
5
6
7
8
int t=0;
int i=0;
for (auto m = a.begin(); m != a.end(); ++m,i++) 
{ 
    if(i%2==1)
        cout << t+*m;
   t=*m;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2018, 11:33

Операторы в условии выполнения цикла while
do{ m = atof(p); if (i&gt;9) break; }while(p = strchr(p, ','), p++); Объясните, пожалуйста,...

При любом условии вылетает из цикла
while(str.empty()==false){ cout&lt;&lt;&quot;выберите операцию&quot;&lt;&lt;endl&lt;&lt;&quot;1.Добавить элемент&quot;&lt;&lt;endl; ...

Битовая инверсия переменной в условии цикла for
Доброго времени суток. Возможно ли ещё как-то использовать/применять конструкцию с битовой...

Вычисление арифметических выражений в условии цикла с параметром
Здравствуйте! Объясните, пожалуйста. Уже, вроде, кучу сайтов перечитал, но так и не нашел ответа....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru