算法整理二——STL

一、STL概述

  • 标准模板库(Standard Template Library)简称STL,是  C++最有特色、最实用的部分之一,高度体现了软件的可复用性。
  • 是所有C++编译器和所有操作系统平台都支持的一种库
  • STL由一些可适应不同需求的集合类(collection class),以及在这些数据集合上操作的算法(algorithm)构成。
  • STL内的所有组件都由模板(template)构成,其元素可以是任意类型
  • 库(library)是一系列程序组件的集合,它们可以在不同的程序中重复使用。库中组件设计的第一位的要求就是通用性。
  •  模板(template)针对一个或多个尚未明确的类型所撰写的函数或类
  • 模板(template)为通用性带来了不可估量的前景。

二、STL的组件主要包括:

  1. 容器(Container) :可以容纳一组元素或元素集合
  2. 迭代器(Iterator) : 在容器上进行遍历
  3. 算法(Algorithm) : 处理容器内的元素
  4. 容器适配器(container adaptor) : 用来扩展容器
  5. 函数对象(functor)

三、STL中7种基本的容器分别是什么?

  1. vector(向量)从后面快速插入与删除,直接访问任何元素
  2. deque(双端队列)从前面或后面快速插入与删除,直接访问任何元素
  3. list (列表)从任何地方快速插入与删除,顺序访问元素,双链表
  4. set (集合)快速查找,不允许重复值
  5. multiset(多重集合)快速查找,允许重复值
  6. map(一对一映射)基于关键字快速查找,不允许重复值
  7. multimap(一对多映射),基于关键字快速查找,允许重复值

四、STL中3种适配器分别是什么?

STL有3种适配器,是用来扩展7种基本容器的容器

  1. 栈适配器:与一种基础容器相结合,来实现后进先出(LIFO)数据结构。
  2. 队列适配器:与一种基础容器相结合,来实现的先进先出(FIFO)数据结构。
  3. 优先级队列(priority_queue)适配器:用以实现优先级队列。最高优先级元素总是第一个出列

五、掌握有关vector的内容

  • vector模拟动态数组,vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
  • 必须包含的头文件#include <vector>
  • vector支持随机存取
  • c.size(),返回实际元素个数
  • c.capacity(),返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器初值

初值:

  • 产生一个适配器

vector <int> l;

  • 以另一个容器初值完成初始化

vector <int> l;

vector <int> c(l.begin,l.end())

  • 以数组元素为初值完成初始化

  • 元素存取

六、vector和数组的区别

  1. array 定义的时候必须定义数组的元素个数;而vector 不需要
  2. array 定义后的空间是固定的了,不能改变;而vector 要灵活得多,可再加或减
  3. vector有一系列的函数操作,非常方便使用
  4. 数组和vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组

七、掌握有关set的内容(尤其注意set具有典型的特点:内部的元素依据其值自动排序;set内的相同数值的元素只能出现一次)

  • 内部的元素依据其值自动排序
  • 在vector,list, deque几个容器中插入数据元素时,插入的位置是确定的(最前,最后或是指定的某个位置上)
  • 而在关联容器中插入数据时,根据插入数据元素的大小确定插入的位置(根据对象所属类中定义的(重载的)比较函数)
  • set内的相同数值的元素只能出现一次
  • multiset内可包含多个数值相同的元素
  • 内部由二叉树(二叉链表,平衡二叉排序树,默认升序)实现,便于查找
  • 必须包含的头文件#include <set>

八、掌握有关“优先队列”的内容,关键是会使用优先队列去解决问题

  • 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
  • 在优先队列中,元素被赋予优先级。
  • 优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的权值排列, 权值最高者排在最前面。默认情况下,优先级队列利用一个大顶堆(优先级高)完成元素的排序。
  • 优先队列的默认的处理过程:

         1)建大顶堆(优先级)

        2)入队时:将要插入的数据插入在vector 最后,将存储结构处理成完全二叉树(堆),新插入的结点肯定为叶子结点。从叶子结点向树根进行调整,将其调整为“大顶”堆(优先级高的位于堆顶)。

       3)调整原则:将堆中元素(第一个操作数)与入队的元素(第二个操作数)进行比较,如果less(比较方式)的结果是true(要入队的元素优先级高),则插入的元素向堆顶方向进行移动。

       4)出队时:最大值(优先级)出队

  • 要改变优先关系(比如,最小值的优先级最高)

方法一:使用greater

方法二:重载数据元素的<运算符

方法三:重载函数调用运算符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季沐晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值