vector.size () неожиданно работает в сравнении - PullRequest
0 голосов
/ 20 октября 2018

Когда я использую vector.size () в сравнениях, это дает неожиданные результаты

vector<int> v;
for(int i = 0; i < v.size() -1;++i){
    printf("i = %d\n", i);
    printf("v[i] = %d\n", v[i]);
}

, поскольку размер вектора равен 0, он ничего не должен печатать, но входит в цикл и печатает i = 0 и дать ошибку сегментации.Но он даже не должен входить в цикл for, поскольку v.size() - 1 равно -1.

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Размер вектора - целое число без знака, поэтому v.size () - 1 никогда не будет -1, а будет очень большим целым числом.

0 голосов
/ 20 октября 2018

Проблема в вашем цикле:

 for(int i = 0; i < v.size() -1;++i)

В частности, эта часть условия: v.size() - 1.

Функция size возвращаетзначение типа size_type, которое, если вы прочитаете, например, , это vector ссылка будет видеть без знака тип.

Это означает, что при вычитании 1из значения 0 вы не получаете -1, а вместо этого получаете очень большое значение, так как значение unsigned underflow возвращается к своему максимальному значению.

Это означает, что ваш цикл действительно будет повторяться, по крайней мере, один раз,и приводит к UB (неопределенному поведению) при индексировании вне границ.

...