C++基础复习自用--vector

本文详细探讨了C++中的vector容器,包括其与数组的区别(静态vs动态分配),动态扩容的原理,以及迭代器处理、clear和内存管理方法,如reserve、resize、shrink_to_fit等。
摘要由CSDN通过智能技术生成

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 类型值。

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值