C++中STL Vector相关的两个问题

来源:互联网 发布:刀剑乱舞短刀极化数据 编辑:IT博客网 时间:2018/11/16 13:06

看到的一道百度笔试题:

  C++中STL Vector相关

(1).push_back函数的内存分配是怎样的?

  答:vector其中一个特点:内存空间只会增长,不会减小。援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。

      在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。

    通过下面的程序体现:

 

 

#include <iostream>#include <cstdlib>#include <vector>using namespace std;class Point{public:        Point()        {            cout << "construction" << endl;        }        Point(const Point& p)        {            cout << "copy construction" << endl;        }        ~Point()        {            cout << "destruction" << endl;        }};int main(){    vector<Point> pointVec;    Point a;    Point b;    pointVec.push_back(a);    pointVec.push_back(b);    cout<<pointVec.size()<<std::endl;    return 0;}


输出结果:

 

分析:

执行  pointVec.push_back(a);  此时vector会申请一个内存空间,并调用拷贝构造函数将a放到vector中,

再执行  pointVec.push_back(b); 此时内存不够,需要扩大内存,重新分配内存,这时再调用拷贝构造函数将a拷贝到新的内存,再将b拷入新的内存,调用Point拷贝构造函数,最后释放原来的内存,此时调用Point的析构函数。

 

(2).clear 函数的内存分配时如何实现的?

答:clear只是把那些元素全部删除掉,并不是释放内存。