关于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长度的缓冲。