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;
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删除元素(数据)详解