Deque
1. 功能
双端数组:可以对 头 尾 进行插入,删除操作
2. deque 和 vector 区别
- vector 对于头部的插入删除效率低,数据量越大,效率越低
- deque 相对而言,对头部的插入,删除速度会比 vector 快
- vector 访问元素时的速度会比 deque 快,这和两者内部实现有关
3. deque 的实现原理
deque 内部有个 中控器,维护每段缓冲区的内容,缓冲区存放真实数据,中控器维护的是每个缓冲区的地址,使得使用 deque 时 像一片连续的内存空间。
4. deque 构造函数
- deque 容器构造
函数原型
deque<T> deq;
// 默认构造形式deque(beg, end);
// 构造函数将 [beg, end] 区间中的元素拷贝给本身。deque(n, elem);
// 构造函数将n个elem拷贝给本身deque(const deque& deq);
// 拷贝构造函数
案例
void PriDeq(const deque<int>& deq)
{
for (auto i : deq)
cout << i << " ";
cout << endl;
}
void test1()
{
deque<int> d1;
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
PriDeq(d1);
deque<int> d2(d1.begin(), d1.end());
PriDeq(d2);
deque<int> d3(10, 100);
PriDeq(d3);
deque<int> d4(d1);
PriDeq(d4);
}
5. 插入和删除
函数原型
两端插入操作
push_back(elem);
// 容器尾部添加一个数据push_front(elem);
// 容器头部添加一个数据pop_back();
// 删除容器最后一个元素pop_front();
// 删除容器第一个数组
指定位置操作
insert(pos, elem);
insert(pos, n, elem);
insert(pos, beg, end);
clear();
erase(beg, end);
erase(pos);
// 删除pos位置的数据,返回下一个数据的位置
6. deque 数据存取
函数原型
at(int idx);
// 返回索引idx 所指的数据operator[];
// 返回索引idx 所指的数据front();
back();
// 返回最后一个容器中元素
7. deque 排序
函数原型
sort(iterator beg, iterator end)
// 对区间内的元素进行排序,默认是升序
stack
- stack 是一种先进后出的数据结构,它只是一个出口
- 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
栈中进入数据称为 — 入栈
栈中弹出数据称为 — 出栈
stack 常用接口
功能描述:栈容器常用的对外接口
构造函数
stack<T> stk;
// stack 采用模板类型,stack对象的默认构造形式stack(const stack &stk);
// 拷贝构造函数
赋值操作
stack& operator=(const stack &stk);
// 重载等号操作符
数据存取
push(elem);
// 向栈顶添加元素pop();
// 从栈顶移除第一个元素top();
// 返回栈顶元素
大小操作
empty();
size()
// 返回栈的大小
queue 容器
概念:Queue 是一种先进先出的数据结构,它有两个出口
- 队列容器允许从一端新增元素,从另一端移除元素
- 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
- 队列中在队尾进数据称为 — 入队
push
- 队列中在队头出数据称为 — 出队
pop
queue 常用接口
构造函数
queue<T> que;
queue(const queue& que);
赋值操作
queue& operator=(const queue &que);
数据存取
push(elem)
// 从队尾添加元素pop();
// 从队头移除第一个元素back()
front()
// 返回第一个元素
大小操作
empty();
size();
// 返回队列的大小
list
将数据进行链式存储
- 链表:是一种 物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针连接实现的
- 链表由一系列 节点 组成,一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域
- STL中的链表是一个双向链表 ,具有两个指针域,分别指向前一个指针域(prev) 和 后一个指针域(next)
优点
- 采用动态存储分配,不会造成内存浪费和溢出
- 可以对任意位置进行快速插入和删除元素,修改指针即可,不需要移动大量元素
缺点
- 容器遍历速度没有数组快
- 占用数组的空间比数组大
总结:List 和 vector 是STL中最常被使用的容器
构造函数
list<T> lst;
list(beg, end);
list(n, elem);
list(const list& lst);
赋值和交换
assign(beg, end);
assign(n, elem);
list& operator=(const list &lst);
swap(lst);
list 大小操作
size();
empty();
resize(num);
resize(num, elem);
list 删除数据
remove(elem)
// 删除容器中所有与 elem 值匹配的元素
数组存取
front();
back();
llist反转和排序
reverse();
// 反转链表sort();
// 链表排序,默认 0 是升序,1 是降序- 所有不支持随机访问迭代器的容器,不可以用标准算法
- 不支持随机访问迭代器的容器,内部会提欧共对应一些算法
案例
void prt(const list<int>& lst)
{
for (auto i : lst)
cout << i << " ";
cout << endl;
}
bool Cmp(int a = 1, int b = 0)
{
return a > b;
}
int main()
{
list<int> lis;
lis.push_back(10);
lis.push_back(20);
lis.push_back(30);
prt(lis);
lis.reverse();
prt(lis);
lis.sort(); // false 是升序
prt(lis);
lis.sort(Cmp); // 降序 返回TRUE
prt(lis);
}