разница между i + 1 <vec.size () и i <vec.size () - 1 - PullRequest
6 голосов
/ 26 июня 2019

во время программирования я обнаружил, что мой код выдавал ошибку времени выполнения, когда я использовал условие i < vec.size() - 1, но работал нормально для i + 1< vec.size(). здесь vec было пусто std::vector.

//giving error
vector<int> vec;
for (int i = 0; i < vec.size() - 1; i++)
{
    //some code
}
//not giving error
vector<int> vec;
for (int i = 0; i + 1 < vec.size(); i++)
{
    //some code
}

Ответы [ 2 ]

13 голосов
/ 26 июня 2019

Метод std::vector::size возвращает std::size_t без знака. Таким образом, если оно пустое, вы получите 0 - 1, но представленное в виде числа без знака, которое опустится и станет 18446744073709551615 в соответствии с дополнением до двух .

4 голосов
/ 26 июня 2019

Sidenote. Не стоит сравнивать числа со знаком и без знака. В C ++ 20 у нас будет новая функция std::ssize, которая возвращает тип со знаком. Тогда ваш пример написан как

 for (std::ptrdiff_t i = 0; i < std::ssize(vec) - 1; ++i)
 {
     //some code
 }

будет в силе.

Обратите внимание, как i объявляется как std::ptrdiff_t (целочисленный тип со знаком) для указания индексации массива.

...