C++入门
C++类和对象(上)
C++类和对象(中)
C++类和对象(下)
C/C++内存管理
C++string类
C++vector类
C++list类
文章目录
- 系列文章目录
- 一、stack是什么?
- 二、stack的使用
- 三、queue是什么?
- 四、queue的使用
- 五、优先级队列
- 六、优先级队列的使用
一、stack是什么?
1. stack是一种容器适配器,专门用在具有后进先出 *** 作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取 *** 作。
二、stack的使用2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和d出。
函数说明 | 接口说明 |
---|---|
stack() | 构造函数不传参数构造一个空栈 |
empty() | 判空 |
size() | 返回元素个数 |
top() | 返回栈顶元素 |
push() | 压栈 |
pop() | 出栈 |
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中 *** 作,其中从容器一端插入元素,另一端提取元素。
四、queue的使用2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
函数声明 | 接口说明 |
---|---|
queue() | 构造函数 |
empty() | 判空 |
size() | 返回元素个数 |
front() | 返回队头元素 |
back() | 返回队尾元素 |
push() | 入队 |
pop() | 出队 |
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”d出,其称为优先队列的顶部。
其实优先级队列就是堆。
六、优先级队列的使用函数声明 | 接口说明 |
---|---|
priority_queue() | 构造函数 |
empty() | 判空 |
top() | 返回优先级队列中最大或最小元素,即堆顶元素 |
push() | 入队 |
pop() | 最大或最小元素出队, 即堆顶元素 |
#include
#include
#include // greater算法的头文件
void TestPriorityQueue()
{
// 默认情况下,创建的是大堆,其底层按照小于号比较
vector<int> v{3,2,7,6,0,4,1,9,8,5};
priority_queue<int> q1;
for (auto& e : v)
q1.push(e);
cout << q1.top() << endl;
// 如果要创建小堆,将第三个模板参数换成greater比较方式
priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
cout << q2.top() << endl;
}
这段代码的倒数第二行好像很复杂,我们来仔细分析一下:
上图是优先级队列的模板参数,第一个参数是类型, 第二个参数是容器适配器,第三个参数是仿函数。
给大家进行一个简单的说明,容器适配器可以自己选定已有的容器。比如我定义一个类,第一个实例化用vector比较合适我就vector,但是第二个实例化用list更好,我就可以传list.
仿函数其实是一个类的成员函数的重载,必须实例化出一个对象才能使用。如下:
template<class T>
class greater
{
public:
bool operator()(const T& x, const T& y)
{
return x > y;
}
};
这个类中重载了() *** 作符。
template<class T, class Container = std::vector<T>, class Compare = less<typename Container::value_type>>
class priority_queue
{
public:
//大根堆
void adjustUp()
{
Compare com; //使用仿函数前要先实例化出一个对象
size_t child = _con.size() - 1;
size_t parents = (child - 1) >> 1;
while (child > 0)
{
if (com(_con[parents], _con[child]))
{
std::swap(_con[child], _con[parents]);
child = parents;
parents = (child - 1) >> 1;
}
else
{
break;
}
}
}
以上是模拟实现优先级队列的一部分,可以看到,使用仿函数前要先实例化出一个对象。同时,如果对第一行模板参数中的关键字typename不了解的可以看这篇文章:typename前缀
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)