STL源码剖析面试问题

  1. 当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的?
  • vector内存用完了,会以当前size大小重新申请2* size的内存,然后把原来的元素复制过去,把新元素插上,然后释放原来的内存。
  • 引用《effective stl》的第十二条:当涉及 STL容器和线程安全性时,你可以指望一个 STL库允许多个线程同时读一个容器,以及多个线程对不同的容器做写入操作。你不能指望 STL库会把你从手工同步控制中解脱出来,而且你不能依赖于任何线程支持。必须自己去写多线程安全措施。
  • 一般我们释放vector里的元素使用clear,其实它不能释放内存,要想释放内存要使用swap,这样:![在这里插入图片描述]
vector<type> v;
//.... 这里添加许多元素给v
//.... 这里删除v中的许多元素
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量

测试代码:

#include <iostream>
#include <vector>

int main()
{
	std::vector<int> 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
  • 插入操作:插入操作会申请新的节点空间,然后加入都红黑树中,原来的迭代器指向的内存空间都未改变,故不会出现迭代器失效。
  • 删除操作:删除操作只会引起被删除节点的迭代器失效。

参考资料

  1. 《STL源码剖析》相关面试题总结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值