首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于vector空间的释放有关问题

2012-02-23 
关于vector空间的释放问题在EFFECTIVESTLitem17中,作者说到:当一个VECTOR膨胀之后,可以用vector T (v).s

关于vector空间的释放问题
在EFFECTIVE   STL   item17中,   作者说到:
    当一个VECTOR膨胀之后,   可以用   vector <T> (v).swap(v);来将多余部分空间去掉,   并且在这一节的最后又说到,当swap调用的时候,   容器的迭代器都是交换了的.

这个让人很疑惑,   在 < <STL源码剖析> > 一书中,   作者给出的关于vector的代码中,   只有~vector中会释放空间,   我不知道STL中vector的swap方法具体怎么实现,   但直觉上,   它只是交换元素,   而不至于释放空间.

  vector有三个 "指针 ",   一个start,   一个end,   一个end_of_range.     其中第二指向最后一个有效元素后面,   第三个指向vector所占最后空间的后面.

  vector <T> (v).swap(v);这一句中,   将临时变量的end,   end_of_range指针也给了v,
会不会因此使得   capacity返回值变小了,   而vector   v   本身所占的空间大小却没有变呢.

我知道我的说法肯定是错的,   但   vector <T> (v).swap(v);究竟是怎么让v的空间释放又重建一个大小合适的vector的呢?

[解决办法]
vector <T> (v).swap(v);

比如v原来的长度是1024,元素个数是0。现在新建了一个临时对象,长度是8,元素个数是0。
swap之后,v与临时对象交换了内部存储,v的长度是8,临时对象的长度是1024。
语句结束临时对象自动析构,释放了1024长度的缓冲。

热点排行