In your posted code, because you used the constructor argument, it will allocate space for 10 int objects in the vector and initialise them all to 0.
Then in your for loop, you're pushing back 10 more int values (remember push_back pushes additional objects into the end of the vector) ranging from 0 to 9.
So your vector will contain 20 ints (10 which are initialised to 0, plus 10 more containing the values 0..9)
Whereas if you use the reserve() function, the difference is that the vector will allocate space for 10 ints, but their values will not be initialised. In other words, it will have allocated space for 10 ints, but the vector initially holds no actual values, it is empty.
So because the vector is empty, if you use push_back to add some ints, the values will be added from the start of vector. So you'd end up with a vector which contains the values 0..9.