一、基础知识
(一)STL
STL简介
STL简称标准模版库,被容纳在C++标准程序库,包含了许多基本数据结构和基本算法,使程序员写起来得心应手
为什么使用STL
在学习数据结构的时候,在程序中会使用到堆、栈、队列、链表等一些基本的算法,而学习数据结构的时候,这些基本算法写起来十分繁琐,如果不想写这些,那么就可以考虑一下STL了。
但是不要太过于依赖STL!
相关基本概念
容器:是存放数据的地方,常见的容器有:链表(list)、栈(stack)、动态数组 (vector)、双端队列(deque)、队列(queue)、映射(map)
迭代器(iterator):可以理解为C语言里的地址,而迭代器就是容器的一个指针,十分重要!!!
算法:可以对容器里的数据做一些基本操作,比如排序,找最大元素等。
STL使用前的初始化
C++:
1.需要对应的头文件,比如list就需要#include,且没有.h,或者万能头#include<bits/stdc++.h>。
2.添加std命名空间(using namespace std;)不加的话后面可以自己写一堆。。。
java:
1.需要import类,可以统一写成import java.util.*;
(二)栈
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。
所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。
那么STL 中栈是用什么容器实现的?
从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
Stack在java中是一个具体实现类,继承Vector类,但已过时,一般使用Deque实现堆栈。
(三)队列
队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器。所以STL 队列也不被归类为容器,而被归类为container adapter( 容器适配器)。
队列Queue是一个抽象接口,一般由LinkedList和ArrayDeque实现。Deque继承自Queue,实现类有ArrayDeque(基于数组的双端队列),LinkedList(基于链表的双端队列)。
现在选择在 java 中使用 栈和队列 的话,推荐选择实现了 Deque 的。
首选是 ArrayDeque ,其次是 LinkedList ,当然这两个都不是线程安全的。对于线程安全的需求,JDK 提供了 BlockingQueue 阻塞队列以及双向队列,这也是一个非常重要的接口。