对于容器类中的向量vector要注意以下几点:
容器类的push_back()成员函数会调用对象的复制构造函数复制该对象,然后将复制后的对象添加到容器中。所以如果添加到向量中的是一个类对象,那么它是复制后的对象。
(向量扩容时所做的工作)将2个类对象添加到已有的3个类对象的向量中时,向量首先申请到一个足以容纳5个类对象的内存块,得到这个内存块后,将旧内存块中的3个元素复制到这个新分配的内存块中,然后将新增的两个元素放在他们后面,最后将旧内存块中的3个元素所占用的内存释放掉。
但是上面如果旧的元素过多造成资源浪费,所以编译器采用以下优化方法:
(优化方法)额外增加新分配的内存空间:一般是增加2倍,初始分配一个对象空间时多分配一倍的空间,这样在往向量中添加一个对象时就不用申请一个新内存块,减少了内存消耗。
然后我们就可以理解向量中size()和capacity()方法的区别了。size()永远取得的是在此时本向量中的元素数,而capacity()取得的是没有增加元素前,这个向量所能容纳的元素数目。假设一开始vector里面有3个元素,size()和capacity()都为3(初始化时两者值是一样的)当增加两个元素后。size()变为5,capacity()变为6。在初始化之后,push_back之前,会将空间变为原来的两倍,所以就变为了6.但是当6充满之后,下一次capacity()将会是12。