STL -容器 <stack> <queue> <list>相关API及原理
链表容器
原理:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,节点可以在运行时动态生成。每个节点包括两个部分:一个是存储数据元素的数据域,一个是存储下一个节点地址的指针域。
相较于vector的连续线性空间,list就显得负责的多,它的好处是每次插入或者删除元素的时间复杂度为O(1)。但是在内存空间上面由于是散列分布的,所以空间利用率并没有vector来的高。
迭代器(不支持随机访问,仅限递增或者递减)
List容器不能像vector一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。List迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓list正确的递增、递减、取值、成员取用是指:递增时指向下一个节点,递减指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。
由于list是一个双向链表,迭代器必须能够具备前移、后移的能力,所以list容器提供的是Bidirectional Iterators
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器失效,这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。甚至List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受影响。
API
构造函数
list<T> lstT
list(beg,end) 构造函数将beg,end区间中的元素拷贝给本身
list(n,elem) 构造函数将n个elem拷贝给本身
list(const list &lst) 拷贝构造函数
插入删除操作
push_back(T)
pop_back(T)
push_front(T)
pop_front(T)
insert(pos,T);
insert(pos,n,T)
insert(pos,beg,end)
clear(); //清空容器中的所有数据
erase(beg,end) 删除区间中的数据,返回下一个数据的位置
erase(pos) 删除pos位置的数据 返回下一个数据的位置
remove(T) 删除容器中所有的与elem所匹配的值(可以重载== 来实现删除自定义的类型)
大小操作
size()
empty()
resize(num)
resize(num,T)
赋值操作
assign(iterator beg,iterator end) 将区间中的数据拷贝赋值到本身
assign(n,T) 将n个elem拷贝赋值到本身
list &operator =(const list &lst)
swap(lst)
数据存取
front(); 返回第一个元素
back(); 返回最后一个元素
排序 去重
unique() 删除list中重复的元素
sort(bool (*fun)(T&,T&)) 给list排序,需要传入一个排序规则:例如 return T1>T2 //从大到小排序
````
# 栈容器
特点 :先进后出(FILO)
## API
### 构造函数
stack
stack(const stack &stk) //拷贝构造函数
# 队列容器
特点:先进先出(FIFO),queue容器允许从一端新增元素另一端删除元素
## API
### 构造函数
queue
queue(const queue&stk) //拷贝构造函数
# 队列和栈共同操作
## 赋值操作
stack &operator=(const stack &stk); //重载
## 数据存取操作
push(T) //压栈 && 向队尾添加元素
pop() //出栈 && 从队头取出数据
top() //返回栈顶元素 && 返回第一个元素(队头)
## 大小操作
empty() //返回是否为空
size() //返回堆栈大小 && 队列大小
```