C++ STL容器概念

string容器:

string其实相当于一个保存字符的序列容器,因此除了有字符串的一些常用操作以外,还有包含了所有的序列容器的操作。字符串的常用操作包括:增加、删除、修改、查找比较、链接、输入、输出等

vector容器:向量

​ 是一个封装了动态大小数组的顺序容器,是一个可以存放任意类型的动态数组。

​ 物理地址与逻辑地址连续,可以实现快速访问(首地址+i直接访问)

   1)可以直接访问任何元素。

   2)线性顺序结构。可以指定一块连续的空间,也可以不预先指定大小,空间可自动扩展,也可以像数组一样被操作,即支持[ ]操作符和vector.at(),因此可看做动态数组,通常体现在追加数据push_back()和删除末尾数据pop_back()。

   3)当分配空间不够时,vector会申请一块更大的内存块(以2的倍数增长),然后将原来的数据拷贝到新内存块中并将原内存块中的对象销毁,最后释放原来的内存空间。因此如果vector保存的数据量很大时会很消耗性能,因此在预先知道它大小时性能最优。

   4)节省空间。因为它是连续存储,在存储数据的区域是没有浪费的,但实际上大多数时候是存不满的,因此实际上未存储的区域是浪费的。

   5)在内部进行插入和删除的操作效率低。由于vector内部按顺序表结构设计,因此这样的操作基本上是被禁止的,它被设计成只能在后端进行追加和删除操作。

vector与数组区别:

​ 1.数组只能手动扩容,vector可以自动扩容

​ 2.数组插入数据后边数据必须向后移动,vector可以任意位置插入

函数含义:

​ 1.push_back 在数组的最后添加一个数据

​ 2.pop_back 去掉数组的最后一个数据

​ 3.at 得到编号位置的数据

​ 4.begin 得到数组头的指针

​ 5.end 得到数组的最后一个单元+1的指针

​ 6.front 得到数组头的引用

​ 7.back 得到数组的最后一个单元的引用

​ 8.max_size 得到vector最大可以是多大

​ 9.capacity 当前vector分配的大小

​ 10.size 当前使用数据的大小

​ 11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

​ 12.reserve 改变当前vecotr所分配空间的大小

​ 13.erase 删除指针指向的数据项

​ 14.clear 清空当前的vector

​ 15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

​ 16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

​ 17.empty 判断vector是否为空

​ 18.swap 与另一个vector交换数据

deque容器:双端队列

   1)是一种优化了的、对序列两端进行添加和删除操作、较快速地随机访问的基本序列容器。

   2)采用多个连续的存储块保存对象,并在一个映射结构中保存对这些块及其顺序的跟踪。由于不需要重新分配空间,因此追加元素时比vector更有效。实际上内部有一个map指针。

   3)支持随机访问,即支持[ ]操作符和.at(),但性能不如vector。

   4)可以进行内部随机插入和删除,但性能不如list。

list容器:双链表

1)线性链表结构。
2)其数据由若干个节点构成,每个节点包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。无需分配指定的内存大小且可任意伸缩,因此它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。因而相比vector它也占更多的内存。

   3)根据其结构可知随机检索的性能很差,vector是直接找到元素的地址,而它需要从头开始按顺序依次查找,因此检索靠后的元素时非常耗时。即不支持[ ]操作符和.at()。

   4)由于list每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,因此它可以迅速在任何节点进行插入和删除操作。

关联容器set、multiset、map、multimap

关联容器是二叉树结构,它根据元素特点排序,迭代器能以元素的特点“顺序地”获取元素。它是以键值的方式来保存数据,即把关键字和值关联起来保存,而顺序容器只能保存一种(可以认为它只保存关键字,也可以认为它只保存值),底层实现是红黑树。

集合set:

   1)快速查找,不允许重复值。

   2)按一定顺序排列,集合中的每个元素被称作集合中的实例。

   3)内部通过链表的方式组织,因此插入的时候比vector快,但在查找和末尾追加比vector慢。

map:

   1)提供一种“键-值”关系的一对一的数据存储能力。键按一定顺序排列且不可重复(set也可以看成没有键只有值的特殊map形式)。

   2)链表方式存储,继承了链表的优缺点。

   3)一对多映射,基于关键字快速查找。

multiset和multimap:

不要求元素唯一,其他同上

关联容器特点:

   1)红黑树的结构原理。

   2)set和map保证了元素的唯一性,mulset和mulmap扩展了这一属性,可以允许元素不唯一。

   3)元素是有序的集合,默认在插入的时候按升序排列。

   4)插入和删除操作比vector快,比list慢。因为vector是顺序存储,而关联容器是链式存储;而同为链式结构,list是线性,而关联容器是排序的二叉树结构,因此每次都需要对元素重新排序,涉及到的元素变动更多。

   5)对元素的检索操作比vector慢,比list快很多。vector是顺序的连续存储,这是最快的速度;而list需要逐个搜索,搜索时间与容器大小成正比,关联容器查找的复杂度log(n),因此容器越大,关联容器相对list越能体现其优越性。

   6)在使用上set区别于顺序容器的是查询上虽然慢于vector,但却强于list。

   7)在使用上map的功能是不可取代的,它保存了“键-值”关系的数据,而这种键值关系采用了类数组的方式。数组是用数字类型的下标来索引元素的位置,而map是用字符型关键字来索引元素的位置。在使用上map也提供了一种类数组操作的方式,即它可以通过下标来检索数据。在STL中只有vector和map可以通过类数组的方式操作元素。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值