Вы не указали, что означает «не работает», то есть в этом случае код не работает.
Тем не менее отвечая на ваш вопрос
Есть ли ошибка, когдаиспользуется для цикла с векторами?
Я скажу, что в коде действительно есть ошибки.
Прежде всего размер векторов определяется как целочисленный тип без знака.Тип int
в общем случае не может вместить все значения целочисленного типа без знака.
В этом выражении
positionsX.size() - 1
используется арифметика целочисленных типов без знака.То есть выражение positionsX.size() - 1
преобразуется в целочисленный тип без знака и будет равно максимальному значению для типа при условии, что positionsX.size()
равно 0. То есть выражение фактически оценивается как
static_cast<decltype( positionsX )::size_type>( positionsX.size() - 1 );
Например, для пустого вектора вы можете получить следующий результат
#include <iostream>
#include <vector>
int main()
{
std::vector<int> positionsX;
auto size = static_cast<decltype( positionsX )::size_type>( positionsX.size() - 1 );
std::cout << size << '\n';
}
Выход консоли
18446744073709551615
В первом случае, когда используется промежуточная переменная
int sizePos = positionsX.size() - 1;
результат выражения
positionsX.size() - 1
может быть обрезан для соответствия объекту типа int
, и соответствующие индексы будут действительными (хотя диапазон может быть в целом недействительным, то есть он можетбыть меньше, чем фактический диапазон).
Таким образом, ваша проблема в том, что вы используете тип int
вместо исходного типа
decltype( positionX )::size_type
Также в циклах отсутствует последний элементvector.
Правильный цикл может выглядеть следующим образом
for (decltype( positionX )::size_type i = 0; i < positionsX.size(); i++) {
//...
}
Или, по крайней мере, вы должны использовать тип size_t в качестве типа переменной i
(хотя первый вариантправильнее)
for ( size_t i = 0; i < positionsX.size(); i++) {
//...
}