wordpress资讯站,建设工程质量管理条例2021,联合加工网,wordpress移动排版修改目录
基本概念
适配器模式
stack.h
test.cpp
双端队列-deque
仿函数
优先级队列 基本概念
1、stack和queue不是容器是容器适配器#xff0c;它们没有迭代器
2、stack的quque的默认容器是deque#xff0c;因为#xff1a;
stack和queue不需要遍历#xff0…目录
基本概念
适配器模式
stack.h
test.cpp
双端队列-deque
仿函数
优先级队列 基本概念
1、stack和queue不是容器是容器适配器它们没有迭代器
2、stack的quque的默认容器是deque因为
stack和queue不需要遍历只需要在固定的一端或者两端进行操作。 在stack中元素增加需要扩容时deque比vector的效率高不需要搬移大量数据queue中的元素增长时deque不仅效率高而且内存使用率高
适配器模式 适配器模式是一种设计模式用于将一个类的接口转换成客户希望的另一个接口这种类型的设计模式属于结构型模式它涉及到单个类的功能增强适配器模式中有三个主要角色
目标接口客户端所期待使用的接口适配器通过实现这个目标接口来与用户进行交互被适配者需要被适配以符合目标接口规范的现有类适配器实现了目标接口并持有一个对被适配者对象的引用在其方法内部调用被适配者对象来完成特定操作
stack.h
#pragma once
#include assert.h
#include vector
#include list
namespace bit
{//适配器模式//stackint,vectorint st1;//stackint,listint st2;templateclass T, class Containerclass stack{public://入栈void push(const T x){_con.push_back(x);}//出栈void pop(){_con.pop_back();}//求大小size_t size(){return _con.size();}//判空bool empty(){return _con.empty();}//获取栈顶元素const T top(){return _con.back();}private:Container _con;};
}
目标接口构成栈所需的操作接口被适配者实现栈的底层数据结构数组或链表 适配器bit::stack类
test.cpp
#include Queue.h
#include Stack.h
#include stack
#include iostream
using namespace std;void test_stack1()
{bit::stackint,vectorint st;st.push(1);st.push(2);st.push(3);st.push(4);while (!st.empty()){cout st.top() ;st.pop();}cout endl;}int main()
{test_stack1();return 0;
}
注意事项函数参数传递的是对象模板参数传递的是类型函数参数可以传递缺省值模板参数也可以传递缺省值
templateclass T, class Container vectorint
bit::stackint st; //此时就等价于bit::stackint,vectorint st
双端队列-deque vector优缺点 优点支持下标随机访问缺点头部或中间插入删除效率低扩容有消耗 list的优缺点 优点任意位置插入删除效率都不错缺点不支持下标的随机访问 第一个stack和queue的2:30:00处 基本概念deque是一种双开口的”连续“空间的数据结构与vector相比头插效率高不需要搬移元素与list相比空间利用率更高deque不是真正连续的空间而是由一段段连续的小空间拼接而成的实际deque类似于一个动态的二维数组
优点deque 允许在两端进行高效插入和删除操作且支持下标的随机访问
缺点中间插入删除效率一般、[]效率一般遍历时deque要频繁的检查是否移动到小空间边界 仿函数
基本概念仿函数是一个类或结构体它重载了函数调用运算符 operator()通过重载该运算符这个类的实例就可以被像函数一样调用
#include iostream//仿函数 函数模板
template class T
struct MyComparator
{bool operator()(const T x,const T y) {return x y;}
};int main() {MyComparatorint cmp;cout cmp(1, 2) endl;//有名对象cout cmp.operator()(1, 2) endl;//有名对象cout MyComparatorint()(1, 2) endl;//匿名对象cout MyComparatorint().operator()(1, 2) endl;//匿名对象return 0;
}优先级队列 ~over~