vector底层实现以及动态扩容
array是静态分配,后期无法改变。如果程序需要更大的array只能重新分配一个地址然后把旧空间里的复制过来。
vector是动态分配,他对大小可以合理控并且重新分配是数据移动效率高
关于查找删除插入
array和vector都是连续分配,可以通过下标随机访问,但如果需要频繁插入和删除则最好使用list,queue.不然的话要搬移所需操作元素后的所有元素
查找O(1)
删除,插入O(n)
扩容的底层原理
三个指针start,finish,out of storage
当空间不够装下数据(##vec.push_back(val)##)时,会自动申请另一片更大的空间(1.5倍或者2倍),然后把原来的数据拷贝到新的内存空间,接着释放原来的那片空间。当释放或者删除(##vec.clear()##)里面的数据时,其存储空间不释放,仅仅是清空了里面的数据。
`
void reserve(size_type n) {
if (capacity() < n) {
const size_type old_size = size();
// 使用空间配置器开辟n个新空间,并将旧空间元素拷贝到新空间
iterator tmp = allocate_and_copy(n, start, finish);// 当n大于当前vector的容量时才会扩容,小于等于当前容量则忽略本次操作
// 释放旧空间
// a. 先调用析构函数,将[start, finish)区间总所有的对象析构完整
destroy(start, finish);
// b. 将空间规划给空间配置器
deallocate();
// 3. 接收新空间并更新其成员
start = tmp;
finish = tmp + old_size;
end_of_storage = start + n;
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_52259848/article/details/126634343`
vector的属性
size和capacity指的空间大小不一样
reserve(n)直接指定数组大小,resize(多个参数)可以改变capacity
vector迭代器失效
当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代器全部失效。
erase:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。erase方法会返回下一个有效的迭代器,所以当我们要删除某个元素时,需要it=vec.erase(it)。
关于clear
clear:vec.clear():清空内容,但是不释放内存。vector().swap(vec):清空内容,且释放内存,想得到一个全新的vector。vec.shrink_to_fit():请求容器降低其capacity和size匹配。vec.clear();vec.shrink_to_fit();:清空内容,且释放内存
扩展如何快速释放内存
1.vec.shrink_to_fit():在c++11以后增加了这个函数,它的作用是释放掉未使用的内存,假设我们先调用clear函数把所有元素清掉,这样是不是整块容器都变成未使用了,然后再调用shrink_to_fit函数把未使用的部分内存释放掉。
2.vector().swap(vec):清空内容,且释放内存,想得到一个全新的vector。
用一个空的vector与当前vector进行交换,使用形如vector().swap(v)这样的代码,将v这个vector变量所代表的内存空间与一个空vector进行交换,这样v的内存空间等于被释放掉了,而这个空vector因为是一个临时变量,它在这行代码结束以后,会自动调用vector的析构函数释放动态内存空间,这样,一个vector的动态内存就被迅速的释放掉了。
严格意义上讲,vector 并不是一个 STL 容器!!
2.vector 底层存储的并不是 bool 类型值。