Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

push_back versus operator[] assignment in c++ vectors

can someone please explain to me in detail why the following code for vectorY will do the assignment but the size of VecY is zero? Also, the begin and end iterators are stuck at the first node. It seems that reserve only works with push back and that you need to construct the vector with the size if you want the iterators for the vectors and the size to work as expected. I am assuming that push_back is doing some type of allocation that the straight assignment is not in this case? I am looking for details explaining this so I can make sure I understand what is happening with a reserve and push_back versus constructing with a size element and then doing assignment as in VecX example.

#include <iostream>
#include <vector>

    int main ( int argc, char *argv[])
    {
      std::vector<int> vecX(2);
      vecX[0] = 1;
      vecX[1] = 2;
      std::cout << " VecX0 Item: " << vecX[0] << std::endl;
      std::cout << " VecX1 Item: " << vecX[1] << std::endl;
      std::cout << " VectorX Size: " << vecX.size() << std::endl;

      std::vector<int> vecY;
      vecY.reserve(2);
      vecY[0] = 1;
      vecY[1] = 2;
      std::cout << " VecY0 Item: " << vecY[0] << std::endl;
      std::cout << " VecY1 Item: " << vecY[1] << std::endl;
      std::cout << " VectorY Size: " << vecY.size() << std::endl;
    }

Output

 VecX0 Item: 1
 VecX1 Item: 2
 VectorX Size: 2
 VecY0 Item: 1
 VecY1 Item: 2
 VectorY Size: 0
like image 563
bjackfly Avatar asked Feb 15 '23 21:02

bjackfly


1 Answers

std::vector<int> vecY;
      vecY.reserve(2);
      vecY[0] = 1;
      vecY[1] = 2;

This code is wrong and evokes Undefined Behavior1. When you reserve a vector, you set the capacity, not the size.

You need to either push_back, or construct the vector as you did in example 1.


"Undefined Behavior" : This invokes Undefined Behavior because of the out-of-range call to operator[] If you call vector::operator[n] where n > vec.size(), the behavior is Undefined.

like image 97
John Dibling Avatar answered Feb 28 '23 19:02

John Dibling