When it deletes the first item, every item after that, then gets shifted down one step.
So when you erase index 0, the following indexes change.
[0] -> Erased
[1] -> [0]
[2] -> [1]
[3] -> [2]
[4] -> [3]
So as you can see, the element at [4] is now at [3]...
Behind the scenes, all of that memory is being physically copied.
So you'll get code to this effect working behind the scenes.
vctc[0] = vctc[1];
vctc[1] = vctc[2];
vctc[2] = vctc[3];
vctc[3] = vctc[4];
So if you have large arrays, it's more efficient to use pointers to your object in the array, than the objects themselves.
************************
As I mentioned in the above solution, you need a deep copy to avoid double deletes.
Put this in your class definition.
public:
c(const c & rhs);
Then this in your .cpp
c::c(const c & rhs)
{
pStr = 0;
SetI(rhs.i);
}