优质做网站,免费制作主图的网站,广州seo软件,西乡建网站当vector的内存用完了#xff0c;它是如何动态扩展内存的#xff1f;它是怎么释放内存的#xff1f;用clear可以释放掉内存吗#xff1f;是不是线程安全的#xff1f; vector内存用完了#xff0c;会以当前size大小重新申请2* size的内存#xff0c;然后把原来的元素复制…当vector的内存用完了它是如何动态扩展内存的它是怎么释放内存的用clear可以释放掉内存吗是不是线程安全的 vector内存用完了会以当前size大小重新申请2* size的内存然后把原来的元素复制过去把新元素插上然后释放原来的内存。引用《effective stl》的第十二条当涉及 STL容器和线程安全性时你可以指望一个 STL库允许多个线程同时读一个容器以及多个线程对不同的容器做写入操作。你不能指望 STL库会把你从手工同步控制中解脱出来而且你不能依赖于任何线程支持。必须自己去写多线程安全措施。一般我们释放vector里的元素使用clear其实它不能释放内存要想释放内存要使用swap这样![在这里插入图片描述] vectortype v;
//.... 这里添加许多元素给v
//.... 这里删除v中的许多元素
vectortype(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量测试代码
#include iostream
#include vectorint main()
{std::vectorint myvector(100);std::cout 1. capacity of myvector: myvector.capacity() \n;myvector.resize(10);std::cout 2. capacity of myvector: myvector.capacity() \n;myvector.shrink_to_fit();std::cout 3. capacity of myvector: myvector.capacity() \n;return 0;
}输出结果
vector插入操作 插入(push_back/insert)操作在vector中加入新的元素但vector中元素总数仍不大于capacity这时插入位置后的元素都被依次移动到下一个位置所以插入位置之后的迭代器都会失效。插入(push_back/insert)操作在vector中加入新的元素但vector中元素总数大于capacity这个时候会重新开辟更大的内存空间将原来的vector中的内容复制到新的vector中回收原先vector的内存空间。由于新的vector的地址已完全改变所以原先的所有迭代器都会失效。 删除操作 删除(pop_back/erase)操作在vector中删除元素删除位置后的元素都被依次复制到前一个位置所以删除位置之后的迭代器都会失效。 set、map插入操作插入操作会申请新的节点空间然后加入都红黑树中原来的迭代器指向的内存空间都未改变故不会出现迭代器失效。删除操作删除操作只会引起被删除节点的迭代器失效。
参考资料
《STL源码剖析》相关面试题总结