STL笔记(3)-deque,queue,stack,list容器

时间:2022-08-22 17:38:58

deque简介

deque是“double-ended queue"的缩写。deque是双端的,而vector是单端的。deque在接口上和vector非常相似,许多操作可以直接替换。

deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法)

deque头部和尾部添加或移除元素都非常快,但是在中部安插元素或移除元素都比较费时。


deque使用前准备

#include <deque>

using namespace std;


deque对象的默认构造形式:

deque<T> deqT;

如:

deque<int>deqInt;//一个存放int的deque容器

deque<float>deqFloat;//一个存放float的deque容器


deque末尾的添加移除操作:

deque.push_back(elem);//在容器尾部添加一个数据

deque.push_front(elem);//在容器头部插入一个数据

deque.pop_back();//删除容器最后一个数据

deque.pop_front();删除容器第一个数据

deque的数据存取


deque可以用deque.at(idx)或deque[idx]进行数据存取,二者差异与vector类似

deque.front();//返回第一个数据

deque.front();//返回最后一个数据


deque与迭代器:(和vector一样,见vector)

deque.begin();//返回容器中第一个元素

deque.end();//返回容器最后一个元素之后的迭代器

deque.rbegin();//返回容器中倒数第一个元素的迭代器

deque.rend();//返回容器中倒数最后一个元素之后的迭代器


deque对象的带参数构造(与vector完全类似)

deque(beg,end);//将[beg,end)区间的元素赋给deque

deque(n,elem);//将n个值为elem的元素赋值给deque

deque(const deque &deq);//将deq赋值给当前的deque


deque的赋值(见vector中assign用法)

deque.assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身

deque.assign(n,elem);将n个elem拷贝赋值给本身

deque & operator=(const deque &deq);//重载等号操作符

deque.swap(deq);//将deq与本身的元素互换


deque的大小:

deque.size();//返回容器中元素的个数

deque.empty();//判断是否为空

deque.resize(num);//重新指定容器的长度为num,容器变长,则以elem值填充新位置,若容器变短,则末尾超出容器长度的元素被删除。

deque.resize(num,elem);重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。


deque的插入(与vector类似):

deque.insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。

deque.insert(pos,n,elem);在pos位置插入n个elem数据,无返回值。

deque.insert(pos,beg,end);在pos位置插入[beg,end)区间的数据,无返回值。


删除:(与vector类似)

deque.clear();

deque.erase(beg,end);

deque.erase(pos);


queue,stack是对deque的限制的容器

queue是队列容器,是一种”先进先出”的容器。queue是简单地装饰deque容器而成为另外的一种容器。

queue使用:

使用:

#include <queue>

using namespace std;

构造函数和vector,deque完全类似


queue的push与pop操作:

queue.push(elem);往队尾添加元素

queue.pop();//从对头移除第一个元素


queue对象的拷贝构造与赋值:

queue(const queue &que);

queue& operator=(const queue &que);


queue的数据存取

queue.back();//返回最后一个元素

queue.front();//返回第一个元素


queue的大小:

queue.empty();//判断是否为空

queue.size();//返回队列的大小


stack的使用

stack是堆栈容器,是一种“先进后出”的容器。stack是简单地装饰deque容器而成为另外的一种容器。

使用前:

#include <stack>

using namespace std;

默认构造函数与vector,deque类似


stack的push与pop操作:

stack.push(elem);//往栈头添加元素

stack.pop();//从栈头移除第一个元素


stack对象的拷贝构造与赋值:

stack(const stack &stk);

stack &operator=(const stack &stk);


stack的数据存取:

stack.top();//返回最后一个压入栈的元素


stack的大小:

stack.empty();//判断堆栈是否为空

stack.size();//返回堆栈的大小


容器list的使用方法

list是一个双向链表容器,可以高效地进行插入删除元素,list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。


list使用前准备

#include <list>

using namespace std;


list头尾的添加,移除操作

list.push_back(elem);//在容器尾部添加一个元素

list.pop_back();删除容器中的最后一个元素

list.push_front(elem);//在容器开头插入一个元素

list.pop_front();//从容器开头移除第一个元素


list的数据存取:

list.front();//返回第一个元素

list.back();//返回最后一个元素


list与迭代器:同vector

list.begin();

list.end();

list.rbegin();

list.rend();


list对象的带参数构造函数:

list(beg,end);

list(n,elem);

list(const list &lst);


list的赋值

list.assign(beg,end);

list.assign(n,elem);

list &operator=(const list &lst);

list.swap(lst);


list的大小

list.size();

list.empty();

list.resize(num);

list.resize(num,elem);


list的插入

list.insert(pos,elem);

list.insert(pos,n,elem);

list.insert(pos,beg,end);


list的删除(有不同):

list.clear();

list.erase(beg,end);

list.erase(pos);

list.remove(elem);删除容器中所有与elem值匹配的元素


list的反序排列

list.reverse();//反转链表,比如list包含1,3,5元素,运行此方法后,list就包含5,3,1元素