【C++】:STL标准库之容器deque & queue & stack & list

时间:2021-08-02 15:14:21

deque

1.简介:

deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端的,而vector是单端的。
deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
deque可以随机存取元素。
deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。

2.deque使用之前的准备

#include <deque> 
using namespace std;

3.deque对象的默认构造

//deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT; 如:
deque <int> deqInt;            //一个存放int的deque容器。
deque <float> deq Float;     //一个存放float的deque容器。
deque <string> deq String;     //一个存放string的deque容器。
...                
 //尖括号内还可以设置指针类型或自定义类型。

4.deque对象的带参数构造

deque(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
deque(n,elem);   //构造函数将n个elem拷贝给本身。
deque(const deque  &deq);  //拷贝构造函数。

5.deque末尾的添加移除操作

deque.push_back(elem);  //在容器尾部添加一个数据
deque.push_front(elem); //在容器头部插入一个数据
deque.pop_back();           //删除容器最后一个数据
deque.pop_front();      //删除容器第一个数据

6.deque的数据存取

deque.at(idx);  //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
deque[idx];  //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
deque.front();   //返回第一个数据。
deque.back();  //返回最后一个数据。

7.deque与迭代器

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

8.deque的赋值

deque.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
deque.assign(n,elem);  //将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
deque.swap(deq);  // 将vec与本身的元素互换。

9.deque的大小

deque.size();      //返回容器中元素的个数
deque.empty();     //判断容器是否为空
deque.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

例如 deqInt是deque 声明的容器,现已包含1,2,3元素。
执行deqInt.resize(5); //此时里面包含1,2,3,0,0元素。
再执行deqInt.resize(8,3); //此时里面包含1,2,3,0,0,3,3,3元素。
再执行deqInt.resize(2); //此时里面包含1,2元素。

10.deque的插入

deque.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
deque.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
deque.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。 

11.deque的删除

deque.clear();                                          //移除容器的所有数据
deque.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
deque.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。

queue

1.简介

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

2.queue使用之前的准备

#include <queue> 
using namespace std;

3.queue对象的默认构造

//queue采用模板类实现,queue对象的默认构造形式:queue<T> queT; 如:

queue<int> queInt;            //一个存放int的queue容器。
queue<float> queFloat;     //一个存放float的queue容器。
queue<string> queString;     //一个存放string的queue容器。
...                 
//尖括号内还可以设置指针类型或自定义类型。

4.queue对象的拷贝构造与赋值

queue(const queue &que);             //拷贝构造函数
queue& operator=(const queue &que); //重载等号操作符

如:
queue queIntA, queIntC;

queue queIntB(queIntA);
queue queIntD;
queIntD = queIntC;

5.queue的push与pop操作

queue.push(elem);   //往队尾添加元素
queue.pop();   //从队头移除第一个元素

例如:queue queInt;
queInt.push(1);queInt.push(3);
queInt.push(5);queInt.push(7);
queInt.push(9);queInt.pop();
queInt.pop();
此时queInt存放的元素是5,7,9

6.queue的数据存取

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

7.queue的大小

queue.empty();   //判断队列是否为空
queue.size();        //返回队列的大小

stack

1.简介

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

2.stack使用之前的准备

#include <stack> 
using namespace std;

3.stack对象的默认构造

//stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT; 如:

stack <int> stkInt;            //一个存放int的stack容器。
stack <float> stkFloat;     //一个存放float的stack容器。
stack <string> stkString;     //一个存放string的stack容器。
...                 
//尖括号内还可以设置指针类型或自定义类型。

4.stack对象的拷贝构造与赋值

stack(const stack &stk);             //拷贝构造函数
stack& operator=(const stack &stk); //重载等号操作符

如:
stack stkIntA, stkIntC;

stack stkIntB(stkIntA);
stack stkIntD;
stkIntD = stkIntC;

5.stack的push与pop操作

stack.push(elem);   //往栈头添加元素
stack.pop();   //从栈头移除第一个元素
例如:stack<int> stkInt;
stkInt.push(1);stkInt.push(3);stkInt.pop();
stkInt.push(5);stkInt.push(7);
stkInt.push(9);stkInt.pop();
stkInt.pop();
此时stkInt存放的元素是1,5

6.stack的数据存取

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

7.stack的大小

stack.empty();   //判断堆栈是否为空
stack.size();        //返回堆栈的大小

list

1.简介

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

2.list使用之前的准备

#include <list> 
using namespace std;

3.list对象的默认构造

//list采用模板类实现,list对象的默认构造形式:list<T> lstT; 如:

list<int> lstInt;            //定义一个存放int的list容器。
list<float> lstFloat;     //定义一个存放float的list容器。
list<string> lstString;     //定义一个存放string的list容器。
...                 
//尖括号内还可以设置指针类型或自定义类型。

4.list对象的带参数构造

list(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
list(n,elem);   //构造函数将n个elem拷贝给本身。
list(const list &lst);  //拷贝构造函数。

5.list头尾的添加移除操作

list.push_back(elem);      //在容器尾部加入一个元素
list.pop_back();              //删除容器中最后一个元素
list.push_front(elem);     //在容器开头插入一个元素
list.pop_front();              //从容器开头移除第一个元素

6.list的数据存取

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

7.list与迭代器

list.begin();                     //返回容器中第一个元素的迭代器。
list.end();                       //返回容器中最后一个元素之后的迭代器。
list.rbegin();         //返回容器中倒数第一个元素的迭代器。
list.rend();         //返回容器中倒数最后一个元素的后面的迭代器。

8.list的赋值

list.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
list.assign(n,elem);  //将n个elem拷贝赋值给本身。
list& operator=(const list &lst);   //重载等号操作符
list.swap(lst);  // 将lst与本身的元素互换

9.list的大小

list.size();       //返回容器中元素的个数
list.empty();      //判断容器是否为空
list.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
list.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

10.list的插入

list.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
list.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
list.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。

11.list的删除

list.clear();                                           //移除容器的所有数据
list.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
list.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。
lst.remove(elem);   //删除容器中所有与elem值匹配的元素。

12.list的反序排列

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