Aryant Shukla
Aryant Shukla

Reputation: 79

difference between i + 1 < vec.size() and i < vec.size() - 1

while programming I found out that my code was giving runtime error when I was using condition i < vec.size() - 1 but was working fine for i + 1< vec.size(). here vec was an empty 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
}

Upvotes: 6

Views: 535

Answers (2)

Evg
Evg

Reputation: 26342

Sidenote. It's not a good idea to compare signed and unsigned numbers. In C++20 we will have a new function std::ssize that returns a signed type. Then your example written as

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

will be perfectly valid.

Note also how i is declared to be an std::ptrdiff_t (a signed integer type) to indicate array indexing.

Upvotes: 4

Cory Kramer
Cory Kramer

Reputation: 117981

The method std::vector::size returns a std::size_t which is unsigned. So if it is empty, you will get 0 - 1, but represented as an unsigned number, that will underflow and become 18446744073709551615 according to two's complement.

Upvotes: 13

Related Questions