关于顺序容易在调用push时拷贝构造函数的调用有关问题

关于顺序容易在调用push时拷贝构造函数的调用问题
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class HasPtr
{
public:
HasPtr(const string &s = string()) :ps(new string(s)), i(0){ cout << "default" << endl; }
HasPtr(const HasPtr &p);
HasPtr & operator=(const HasPtr &p);
~HasPtr(){ delete ps; cout << "delete" << endl; }
private:
string *ps;
int i;
};
HasPtr::HasPtr(const HasPtr &p)
{
ps = new string(*p.ps);
i = p.i;
cout << "copy " << *ps << endl;
}
HasPtr & HasPtr::operator=(const HasPtr &p)
{
auto np = new string(*p.ps);
delete ps;
ps = np;
i = p.i;
return *this;
}

int main()
{
vector<HasPtr> hpvec;
cout << "Enter a word: ";
string temp;
while(cin >> temp)
{
HasPtr hp(temp);
hpvec.push_back(hp);
cout << "Enter a word: ";
}
return 0;
}

两次输入,在vs2013中,比如第一次输入hello,调用默认构造函数,再调用复制构造函数构造了*ps为hello的HasPtr,最后调用析构函数。但是第二次输入world,会调用两次复制构造函数,连hello也被重新拷贝构造了一次,这个是为什么?容器调用push时会对其元素进行拷贝初始化,但是第二次增加的元素只有一个world,为什么连容器中的第一个元素也会被再拷贝一次,如果是三个输入,则第三次就会拷贝三个。
------解决思路----------------------
提个问题:vector为什么比数组方便?

因为当push元素且vector内存不够的时候会重新分配,并且会将现有的元素拷贝到新的内存空间…………………………具体的看一下vector的代码就明白了。