STL中的栈(stack)队列(queue)双端队列(deque)等结构的基本操作总结

1 栈(stack)的基本用法

1.1头文件和数据类型

数据类型,既可以是整形(int),浮点型(float)也可以是二叉树指针(TreeNode *)等等

#include<stack>
stack<int>s;

1.2 基本操作

s.empty()//如果栈为空返回true,否则返回false  
s.size()//返回栈中元素的个数  
s.pop()//删除栈顶元素但不返回其值  
s.top()//返回栈顶的元素,但不删除该元素  
s.push(data)//在栈顶压入新元素 

注意:栈没有clear()函数,没有封装好的clear()函数,同样队列queue也没有clear()函数的。

1.3 清空栈的方式

方法一:循环清空

stack<int> s;
while(!s.empty())
	s.pop();
// stack操作的是堆内存,所以要一个一个弹出。

方法二:

 s = stack<elemType>();

方法三:

stack<int> s;
stack<int>().swap(s);
// swap相当于交换了s和一个空临时stack的内容,然后临时stack再结束生命周期,但由于操作的是堆空间,其实还是一个一个释放空间。

但是swap比pop要快,耗时差不多是1/3
测试代码:

int N = 10000000;

stack<int> s2;
for(int i=0;i<N;i++) s2.push(i);

double s2a = (double)clock();
stack<int>().swap(s2);
double s2b = (double)clock();
printf("\e[01;34m Program use Time: \e[01;31m%.4f ms\e[0m\n",s2b - s2a);

stack<int> s1;
for(int i=0;i<N;i++) s1.push(i);

double s1a = (double)clock();
while(!s1.empty()) s1.pop();
double s1b = (double)clock();
printf("\e[01;34m Program use Time: \e[01;31m%.4f ms\e[0m\n",s1b - s1a);

输出:

Program use Time: 168283.0000 ms
Program use Time: 510330.0000 ms

2 队列(queue)的基本用法

2.1头文件和数据类型

#include<queue>
queue<int>q;

数据类型,既可以是整形(int),浮点型(float)也可以是二叉树指针(TreeNode *)等等

2.2 基本操作

q.empty()// 如果队列为空返回true,否则返回false  
q.size() // 返回队列中元素的个数  
q.pop()  //删除队列首元素但不返回其值  
q.front()  // 返回队首元素的值,但不删除该元素  
q.push(data) //在队尾压入新元素 
q.back() //返回队列尾元素的值,但不删除该元素

注意:队列queue没有clear()函数,没有封装好的clear()函数,但是双端队列deque有clear()函数的。

2.3 清空队列queue的方式

方法一:直接用空的队列对象赋值

queue<int> q1;
// process
// ...
q1 = queue<int>();

方法二:遍历出队列

while (!Q.empty()) Q.pop();

方法三:使用swap,这种是最高效的,定义clear,保持STL容器的标准。

注意:不是很理解的。

void clear(queue<int>& q) {
	queue<int> empty;
	swap(empty, q);
}

3 容器(vector)的基本用法

3.1 头文件和数据结构

#include<vector>
vector<int>v

数据类型,既可以是整形(int),浮点型(float)也可以是二叉树指针(TreeNode *)等等

说明:vector可以看做比较好用的数组形式,实际上在C++中已经很少应用传统的数组了,例如像int a[10]这种了,vector这种数组形式可以让我们方便地实时添加和删除元素例如vectorb,另外二维数组也可以用vector例如vectora,就定义了一个vector形式的二维数组。a.push_back(b)就填充二维数组的每一行了。

3.2 基本操作

v.size();//容量大小
v.push_back()//添加元素
v.pop_back()//删除元素
v.insert()//在任意位置添加元素
v.erase()//在任意位置删除元素
v.swap()//交换元素
v.assigin()//多个元素赋值
v.clear()//清除多个元素

v.insert()//在任意位置添加元素 查看一下怎么使用
v.erase()//在任意位置删除元素
v.swap()//交换元素

3.3 清除vector

方法一:

//1. clear(),清空元素,但不回收空间

//vecnum.clear();

//2. 使用 erase循环删除,结果同上

//vector<int>::iterator it;
//for (it = vecnum.begin(); it != vecnum.end(); )
//{
//    //注意使用erase()方法时,迭代不要随意的++
//    it = vecnum.erase(it);
//}

//结论:erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据,所以vector不适合做频繁删除的容器

//3. 最简单的使用swap,清除元素并回收内存
//3.1 写法一

//vector<int>().swap(vecnum);

//3.2 写法二
vecnum.swap(vector<int>());

//打印vector的大小和容量
cout << "last: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;

关于vector详细用法可以看这篇博客

4 双向队列(deque)的基本用法

4.1头文件和数据结构

#include<deque>
deque<int>d;

数据类型,既可以是整形(int),浮点型(float)也可以是二叉树指针(TreeNode *)等等

4.2 常用操作

 d.push_back() //在尾部添加一个元素
d.push_front() //在首部添加一个元素
d.pop_back() //在尾部删除一个元素
d.pop_front() //在首部删除一个元素
d.front() //访问首元素
d.back() //访问尾元素
d.clear() //清空容器内容
d.size() //返回目前元素的数量

参考链接:
C++:清空stl的stack容器
C++ vector清空元素的三种方法
C++ vector删除元素(数据)详解

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值