Here's what happens:
Before the first push_back, the vector capacity (the number of elements that fit into the allocated space) is 0. Therefore, when you do the first push_back, it allocates space for 1 element and calls the copy constructor (1st call).
So, now the capacity is one, and you tell her to add another element. Thus, he should allocate more space, in this case, a place for another element and copy the original elements to a new space (2nd call). The second push_back again calls the copy constructor (third call).
Now you have capacity 2 and tell him to add another item. Therefore, he must allocate more space and copy elements to a new space (4th and 5th calls). Then the third push_back again calls the copy constructor (6th call).
As others have pointed out, you can use a reserve that will allocate space forward, avoiding the need for redistribution and, therefore, accessing the copy constructor.
source share