【C++】STL--------容器

本文详细介绍了C++ STL中的三种顺序容器——vector、list和deque,包括它们的底层实现、操作时间复杂度、优缺点及适用场景。同时,也探讨了关联容器set、multiset、map和multimap,以及容器适配器stack、queue和priority_queue的特性与使用。
摘要由CSDN通过智能技术生成

1、顺序容器

vector

向量容器。底层是动态开辟的一维数组.

       1.实现原理(关键在于对其大小的控制以及重新配置时的数据移动效率)

Vector是C++STL标准模板库中的顺序容器,底层是一个内存可增长的数组动态空间,随着元素的增加,它的内部机制会自行扩充空间用来容纳新元素,每次以2倍的方式另外分配一块空间,然后将内容拷贝,之后在原内容之后构造新元素,并释放原来的空间。因此一旦引起空间重新分配,只想原来的vector的所有迭代器都会失效。

        2.操作的时间复杂度

Push_back        O(1)                             insert        O(n)

pop_back          O(1)                             erase        O(n)

访问                   O(1)                            

        3.和数组的区别

Vector长度不固定,数组是固定长度,必须实现定义好,没有vector灵活。如果在堆上开辟一块数组内存的话,不但要维护数组的长度,要是堆上的数组内容满了就必须自己处理对数组进行扩容,增大代码的复杂度,管理数组的代码和处理业务的代码混到一块,增加代码耦合程度,不利用体现的高内聚、低耦合的思想。

Vector提供了size,push_back,swap等比较好用的方法,帮助我们直接实现代码上想要的逻辑,速度比数组快

Vector可以实现更复杂的数据结构,vector<vector<int>>,相当于二维数组,但是二维数组的每一行都是长度一样的,而vector实现的二维数组,很灵活。

        4.使用vector时的注意事项

Insert是在所指的元素之前进行插入,erase返回的迭代器指向被最后删除的元素的下一个元素

插入和删除元素后迭代器失效问题

预先知道所需空间可以使用reserver预先分配内存

  • reserve():是用来预留容量的,并不会改变容器的有效元素个数。即用reserve()开辟空间时,仅改变capacity大小,与size无关。
  • resize(): 它主要用来调整容器有效元素的个数,有时候也会造成容量的改变。因此用resize()开辟空间时,会对增加的空间全部进行初始化,使得有效元素个数增加。
  • 容量: 即capacity,是指容器在自由内存中获得存储空间的大小
  • 大小: 即size,指的是容器中实际(有效)元素的个数

list

列表容器。底层是带头节点的双向链表容器

        1.各种时间复杂度

Push_back        O(1)                    insert        O(1)

Push_front       O(1)                    erase        O(1)

Pop_back          O(1)                    访问         O(n)

Pop_front         O(1)                    自带sort()函数

      2.Vector和list的区别

Vector和list是C++STL里面的两个顺序容器,vector底层是一个内存可以2倍增大的一维数组,list底层是一个带有头节点的双向链表,因此vector更适合可以通过下标随机访问和末尾的增加删除场景,时间复杂度为O(1),list更适合任意位置删除和增加情况比较多的场景,时间复杂度为O(1)。

deque

双端队列容器。底层是动态开辟的二维数组

       1.各种时间复杂度

Push_back()     O(1)                             访问         O(1)

Push_front       O(1)                             insert        O(n)

Pop_back          O(1)                             erase        O(n)

Pop_front         O(1)

       2.底层实现原理

Deque属于C++STL顺序容器中的一种,双端队列,底层是一个动态开辟的二维数组(称deque_map,但是它不是映射表map,就只是二维数组,一维的数组里放的全是指针,指向二维的分段连续的缓冲区buffer)。Deque底层的内存是分段连续的,整体不连续。底层的数据结构类似链地址法实现的哈希表数据结构,不过哈希表放的是链表,deque放的是数组。

      3.Deque和vector的区别

Vector提供了push_back和pop_back尾端的插入删除,时间复杂度是O(1),但是vector首端插入删除效率低O(n),deque是双端队列,提供push_back  pop_back  push_front  pop_front,尾部和首部的插入和删除,时间复杂度都为O(1)。但是如果从中间进行插入和删除操作时由于vector底层内存时连续的,效率要比deque高,所以一般首尾增删比较多的情况下选择deque,否则一般都是用vector。但是当数据量不大时,由于deque的第二维数组是事先分配好的内存,可以直接使用,初始操作效率高。Vector在如果大小不够还要进行2倍扩容,初始操作效率低。STL中的stack和queue默认就是依赖deque实现的,但是优先级队列priority_queue是依赖vector实现的,优先级队列底层默认是一个大根堆,构建效率高。

2、关联容器

Set/multiset

单重集合/多重集合。底层实现是红黑树

Map/multimap

单重映射表/多重映射表。底层实现是红黑树

底层实现:STL中的一种关联容器,存的是key-value键值对的映射表容器,有map和multimap,之间的区别就是map不允许key重复,而multimap允许key重复。底层是一棵红黑树,不严格的平衡二叉树,左右子树的高度差不能超过短子树高度的2倍,数据的增删查效率都比较高,平均时间复杂度在O(logn)。

 

3、容器适配器

stack

栈。底层默认依赖deuqe容器实现一个先进后出的栈结构

queue

队列。底层默认依赖deque容器实现一个先进先出的队列结构

priority_queue

优先级队列。底层默认依赖vector实现一个大根堆结构,默认值越大,优先级越高

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值