【C++】STL容器总结

news/2024/7/7 13:20:07 标签: stl

https://blog.csdn.net/hudfang/article/details/52934130

三大类容器:

1. 序列式容器:vector、deque、list

vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23.....增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决:  

vector<int> V;V.push_back(1); V.push_back(2);V.push_back(1); V.push_back(2);
vector<int>().swap(V); 或者 V.swap(vector<int>());

利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。

deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。

list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

三者的适合使用的场景:

    1) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
    2) 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
    3) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

2. 关联式容器:map、set

3. 容器适配器:queue、stac

 


http://www.niftyadmin.cn/n/1426158.html

相关文章

文件上传的完整代码

/** <summary> /// 功能&#xff1a;将文字写入图片 /// </summary> /// <param name"strfileName">文件名字</param> /// <param name"strtext">需要写入的文字</param> private void TextToImage(string strfileNam…

【算法】BFS套路 含队列代码队列

1126 地图分析 #define MAX_NUMS 1000000 typedef struct Node_ { int x; int y; }Node; typedef struct Queue_ { Node arr[MAX_NUMS]; int front; int rear; }Queue; void QueueInit(Queue* queue) { queue->front 0; queue->rear…

取现在时间和用户IP

java.text.*,java.util.*" SimpleDateFormat formatnew SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String nowdateformat.format(new Date());<%nowdate%> String iprequest.getRemoteAddr();

计数1

String iprequest.getRemoteAddr(); 获取用户ip 记录新用户 <jsp:useBean id"mycount" class"com.pp.db.CountOnline "></jsp:useBean> <% String iprequest.getRemoteAddr(); //获得用户ip地址 mycount.setUseri…

pv promotion video

pvPromotion Video&#xff08;有人说和我们所说的MV是一回事&#xff0c;其实不然&#xff0c;看名字就知道啦&#xff0c;是宣传推广用的VIDEO&#xff0c;大家也应该注意到了PV都是在单曲推出前10天左右就在电视上有播了&#xff0c;就是为了宣传即将到来的新单曲&#xff0…

JSP在线统计 源码 未研究

http://d.download.csdn.net/down/244777/wumaolin jsporacle

window.open参数一览

<script type"text/javascript">function StorePage(){ddocument;td.selection?(d.selection.type!None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyitwindow.open(http://www.365key.com/storeit.aspx?tescape(d.titl…