浅析STL之STL是什么,包含什么,怎么用呢?

半腔热情 提交于 2019-12-10 04:54:52

初识STL——基础篇

一、STL到底是什么

 STL从广义上分为:容器、算法和迭代器。迭代器是容器和算法的粘合剂。

又细分为六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器;彼此间可以组合套用。
容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰仿函数。
总的来说,STL不仅是一个可复用的组件库,而且是包装了算法和数据结构的软件框架。

二、STL三大组件

1、容器

  • 数组(array)、链表(list)、栈(stack)、队列(queue)、集合(set)、映射表(map)

  • 根据数据在容器中的排列特性,分为序列式容器和关联式容器。序列式容器:强调值得排序,如Vector、Deque、List;关联式容器:元素在容器中并没有保存元素置入容器时得到逻辑顺序,如Set、Map。
    2、算法

  • 质变算法:用了之后会改变元素内容的方法,如替换、删除;

  • 非质变算法:用了之后不会改变元素内容的方法,如查找、遍历。
    3、迭代器到底是个啥东西呢?
    迭代器它是一个抽象的设计概念,在程序里实际并没有直接对应于这个概念的实物。它是一种方法,能够遍历某个容器当中的元素,而又不用暴露该容器的内部表述方式。而我们操作的时候,可以把它理解为一个指针来操作。

三、常用容器

1. string容器(在头文件中)

  • C风格字符串(以空字符串结尾的字符数组)

  • string和C风格字符串对比:char是一个指针,String是一个类,String封装了char,管理这个字符串,是一个char的容器;String封装了很多实用的成员方法,如find、copy、insert等;不用考虑内存释放和越界,String管理char所分配的内存,都由String类负责维护。

  • String容器常用操作
    a.构造,赋值assign
    b.对字符存取[]和at的区别
    []访问越界,程序直接挂掉;
    at访问越界,则抛出异常out_of_range。
    c.char*可以隐式的转换为String,反之不行。

2.Vector容器——单端数组,动态空间

  • 动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是重新找一块更大的新内存空间,然后将原数据拷贝到新空间,并释放原空间。因此,对Vector的任何操作,一旦引起空间的重新配置,指向原Vector的迭代器就都失效了。
  • Vector采用的数据结构——线性连续空间
  • 常用操作(所有容器存在的操作基本一致,细节上可能略有差异)
    a.构造、赋值,如vector<int*> v(v1.begin(),v1.end()),初始化v;
    b.计算容器大小v.size();重置容器大小v.resize(n);
    c.交换两个vector对象的元素,v.swap(v1).
    -Vector迭代器是随机访问的迭代器,支持跳跃式访问。

3.deque容器——双端数组,没有容量

  • deque容器实现原理在这里插入图片描述
  • 中控器:一块连续内存空间,每个元素为一个指针,指向另一段连续内存,称为缓冲区——deque的存储空间的主体。
  • 当deque容器中0x01指向的空间满后,中控器会再找一块内存接着插入元素,所以deque容器没有容量这一说。

4、list容器——循环双向链表

  • list迭代器必须具备前移、后移的能力,所以list容器提供的是Bidirectional Iterators.
  • 插入和删除操作,不会造成原有list迭代器的失效,List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响——这与Vector是不同的。
  • 所有不支持随机访问的迭代器,不可以用系统提供的算法;如果不支持用系统提供的算法,则这个类内部会提供。如:list<int*>L,sort(L.begin().Lend())是错误的,正确用法为L.sort()。
  • 对于自定义数据类型排序时,必须要指定排序规则。

5.Set/multiset容器——关联式容器,红黑树

  • 所有元素会根据元素键值自动被排序;
  • Set的元素既是键值又是实值
  • Set不允许两个元素有相同的键值;
  • 不能通过Set的迭代器改变Set元素的值,Set的迭代器是一种const_iterator
  • multiset容器——与Set唯一差别:允许键值重复
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!