我们实现的数据结构是为了解决在运行过程中动态的开辟空间使用(例如我们不停的输入,输入的多少我们不确定)
原理两种:
一、笨办法
我们第一次用多少空间,开辟多少空间A
我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据拷贝到B中,然后释放A,在C中写入新的数据
缺点:在于拷贝的次数太多,效率低
二、改进的办法
矢量有一个参数,里面填写预留的空间,加入我们填写的预留空间大小是B,这里是预留,并没有真正的开辟物理内存,预留的作用于如果这时候如果需要开辟空间做其他事情,开辟的空间会避开B,这样不好造成在这里的数据变成不连续
然后开辟空间写入数据A,仅占B的一点点而已,vector中的realloc提交数据后操作系统管理内存的机制会映射一个“内存页”4K的空间给你来使用,当在B中继续开辟空间填写数据D,这时候存入D的物理内存并不是真正的开辟,而是接着使用刚刚开辟的“内存页”,只有当4K空间用完,才会再次分配一个页使用
当写入的数据超过B,会重新开辟一块空间C,将B中的数据拷贝入C中,释放B
优点:拷贝次数大大减少,效率提高
std中vector的实现原理(标准模板动态库中矢量的实现原理)
时间: 2024-10-10 15:49:05