OOP一次作业
发现之前的C++知识不够用了
特来学习一下标准库容器
C++标准模板库提供了10种容器
容器的概念基于数据结构的基本知识
数据结构中:
数据的逻辑结构
数据的存储结构
数据的操作
逻辑结构:
线性、非线性。
线性:除第一个和最后一个,其他元素都有且只有一个前驱和后继。
非线性:零到多个前驱后继。
存储结构:(物理结构)
顺序存储、链式存储。
顺序存储:把数据存储与一段连续地址空间的内存中。(ex 数组)
链式存储:使用节点(数据域+指针域),通过指针关联衔接。在存储中不一定相邻。(ex 链表)
操作:
操作定义于数据的逻辑结构上,具体实现与存储结构相关。
常用操作:访问元素、统计个数、更新、插入、删除、查找、排序
几种数据结构:
线性表:
栈(stack)
队列(queue)
优先队列(priority queue):
优先级队列是队列的一种形式,它是对每次插入队列后的数据按某种规则进行排序,每次删除的均是优先级最高的数据元素。
树:有层次关系
二叉树、堆
图:无层次关系,每个元素有多个前驱和后继
数组、矩阵:
广义表:
广义表是n 个数据元素组成的有限序列。同数组不一样,它的每一个元素可以是不同的数据类型或数据结构,可以是一个不可分的元素,也可以是一个复杂的数据结构甚至可以是一个广义表。如果广义表的子表是其自身,则称该广义表为递归表。
广义表是一种线性结构,其数据元素之间有线性的固定的次序关系,但它不等于线性表,仅当其数据元素全部是原子元素时才等价于线性表。所以说广义表是线性表的扩展,而线性表是广义表的特例。
广义表也是一种多层次结构,当广义表的数据元素中包含子表时,该广义表就是一种多层次的结构。
所以广义表可以是线性结构也可以是非线性结构,它既可以表示简单的线性结构,也可以表示树、图等复杂的非线性结构。它是数据结构的一种综合形式。按存储方式分广义表可以分为顺序存储和链式存储两种方式。
C++的容器:
在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。
用于保存其他对象的对象,并且这种对象还包含一系列处理其他对象的方法。
可以自行扩展(自行申请释放内存,并用最优的算法来执行命令)
容器是随着面向对象语言的诞生而提出的,容器类在面向对象语言中特别重要,在现在几乎所有的面向对象的语言中也都伴随着一个容器集。
通用容器
分类:
STL中的容器分为三类:顺序性容器、关联式容器和容器适配器。
顺序性容器
是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。
关联式容器
和顺序性容器不一样,关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。
关联式容器另一个显著的特点是它是以键值的方式来保存数据,就是说它能把关键字和值关联起来保存,而顺序性容器只能保存一种(可以认为它只保存关键字,也可以认为它只保存值)。这在下面具体的容器类中可以说明这一点。
容器适配器 是一个比较抽象的概念, C++ 的解释是:适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器是让一种已存在的容器类型采用另一种不同的抽象类型的工作方式来实现的一种机制。其实仅是发生了接口转换。那么你可以把它理解为容器的容器,它实质还是一个容器,只是他不依赖于具体的标准容器类型,可以理解是容器的模版。或者把它理解为容器的接口,而适配器具体采用哪种容器类型去实现,在定义适配器的时候可以由你决定。
标准容器类 | 特点 |
顺序性容器 | |
vector | 从后面快速的插入与删除,直接访问任何元素 |
deque | 从前面或后面快速的插入与删除,直接访问任何元素 |
list | 双链表,从任何地方快速插入与删除 |
关联容器 | |
set | 快速查找,不允许重复值 |
multiset | 快速查找,允许重复值 |
map | 一对多映射,基于关键字快速查找,不允许重复值 |
multimap | 一对多映射,基于关键字快速查找,允许重复值 |
容器适配器 | |
stack | 后进先出 |
queue | 先进先出 |
priority_queue | 最高优先级元素总是第一个出列 |
from 浅谈C++容器