There is no any sense to define an object of type std::vector the way you showed

vector<int> numbers (0);

This definition is equivalent to

vector<int> numbers;

Also if you define an object of type std::vector this way

vector<int> numbers (2);
numbers[0] = 1;
numbers[1] = 2;

that is you know that the vector will contain at least two elements then it is better to do this the following way

vector<int> numbers;
numbers.resetve( 2 );

numbers.push_back( 1 );
numbers.push_back( 2 );

or

vector<int> numbers = { 1, 2 };

For fundamental types there is no a big difference between your definition and the code I have showed. However if a user defined type is used then it is better to use the definition I have showed because in your case at first the default constructor will be called two times and after that created elemenets of the vector will be overwritten by the copy assignment operator.