.net 做网站从优化角度来建设网站
.net 做网站,从优化角度来建设网站,天津移动网站设计,什么网站可以销售自己的产品目录 1.什么是queue
2.模拟实现
3.仿函数
模板参数Compare
仿函数 4.什么是priority_queue
模拟实现 1.什么是queue
1.队列是一种容器适配器#xff0c;专门用于在FIFO上下文(先进先出)中操作#xff0c;其中从容器一端插入元素#xff0c;另一端提取元素。 2.队列作为…目录 1.什么是queue
2.模拟实现
3.仿函数
模板参数Compare
仿函数 4.什么是priority_queue
模拟实现 1.什么是queue
1.队列是一种容器适配器专门用于在FIFO上下文(先进先出)中操作其中从容器一端插入元素另一端提取元素。 2.队列作为容器适配器实现容器适配器即将特定容器类封装作为其底层容器类queue提供一组特定的成员函数来访问其元素。元素从队尾入队列从队头出队列。 3.底层容器可以是标准容器类模板之一也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
4.标准容器类deque和list满足了这些要求。默认情况下如果没有为queue实例化指定容器类则使用标准容器deque。 empty检测队列是否为空size返回队列中有效元素的个数front返回队头元素的引用back返回队尾元素的引用push_back在队列尾部入队列pop_front在队列头部出队列 用法跟stack一样可以看上一篇文章
2.模拟实现
queue.h
#include string.h
#includeiostream
#includestack
#includedequeusing namespace std;namespace lty
{templateclass T, class Container dequeTclass queue{public:void push(const T x){_con.push_back(x);}void pop(){_con.pop_front();}T front(){return _con.front();}T back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void testqueue(){queueint,dequeint q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);while (!q.empty()){cout q.front() ;q.pop();}cout endl;}
}queue.cpp
#include queue.husing namespace std;int main()
{lty::testqueue();
} 3.仿函数
模板参数Compare #include iostream
#include queueint main() {std::priority_queueint maxHeap; // 默认大堆std::priority_queueint, std::vectorint, std::greaterint minHeap; // 小堆maxHeap.push(5);maxHeap.push(3);maxHeap.push(8);minHeap.push(5);minHeap.push(3);minHeap.push(8);std::cout Max Heap (Top element): maxHeap.top() std::endl;std::cout Min Heap (Top element): minHeap.top() std::endl;return 0;
}仿函数
仿函数实际就是一个类这里类实例化出来的对象叫做函数对象下面命名空间wyn中的两个仿函数就分别是两个类在使用时直接用类进行实例化对象然后让对象调用()的运算符重载这样我们看到的调用形式就非常像普通的函数调用但实际上这里并不是函数调用而是仿函数实例化出来的对象调用了自己的operator()重载成员函数。 namespace lty
{template class Tclass less{public:bool operator()(const T x, const T y)const{return x y;}};template class Tclass greater{public://将仿函数放成public要不然class默认是私有的bool operator()(const T x, const T y)const{return x y;}};
}
int main()
{lty::lessint lessFunc;lty::greaterint greaterFunc;lessFunc(1, 2);//你以为这里是函数调用但他其实是仿函数对象lessFunc调用了他的成员运算符重载()函数。
}4.什么是priority_queue
优先级队列的适配会更复杂一些些。它的适配容器用的是vector。
优先级队列就不是什么先进先出了它虽然叫队列但它不是真队列。其实它的底层是堆可以在任意时刻插入数据默认是大堆当然也可以通过仿函数去调整。
优先级队列有一个反人类的设计传less仿函数底层是大堆。传greater仿函数底层是小堆。
它的一些接口 priority_queue和queue以及stack一样他们都是由底层容器适配出来的适配器之不过priority_queue采用的适配容器不再是deque而是vector选择vector的原因也非常简单在调用向上或向下调整算法时需要大量频繁的进行下标随机访问这样的情境下vector就可以完美展现出自己结构的绝对优势 模拟实现
#pragma oncenamespace lty
{// Compare进行比较的仿函数 less-大堆// Compare进行比较的仿函数 greater-小堆templateclass T, class Container vectorT, class Compare std::lessTclass priority_queue{public:priority_queue(){}template class InputIterator priority_queue(InputIterator first, InputIterator last){while (first ! last){_con.push_back(*first);first;}for (int i (_con.size()-1-1)/2; i 0; --i){adjust_down(i);}}void adjust_up(size_t child){Compare com;size_t parent (child - 1) / 2;while (child 0){if (com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);child parent;parent (child - 1) / 2;}else{break;}}}void push(const T x){_con.push_back(x);adjust_up(_con.size() - 1);}void adjust_down(size_t parent){Compare com;size_t child parent * 2 1;while (child _con.size()){if (child 1 _con.size() com(_con[child],_con[child 1])){child;}if (com(_con[parent],_con[child])){std::swap(_con[child], _con[parent]);parent child;child parent * 2 1;}else{break;}}}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T top(){return _con[0];}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}private:Container _con;};
}命名空间 xzq 这段代码位于命名空间 xzq 中这是一个自定义的命名空间用于将相关的类、函数等封装在一起以避免与其他代码的命名冲突。
模板类 priority_queue 这是一个模板类它代表了一个优先队列的实现。它接受三个模板参数T元素类型Container底层容器类型默认为 std::vectorT和 Compare用于比较元素的仿函数默认为 std::lessT
Compare 是一个模板参数用于进行元素的比较。它是一个仿函数可以是 std::lessT默认或 std::greaterT具体取决于用户提供的优先队列类型。Compare 仿函数用于确定在堆中的元素排序方式从而决定了是最大堆还是最小堆。在 priority_queue 类的各个成员函数中通过调用 Compare 仿函数来进行元素的比较从而实现了插入和调整堆的操作。
构造函数 priority_queue() 这是一个默认构造函数不需要使用 Compare 仿函数进行比较。
构造函数模板 priority_queue(InputIterator first, InputIterator last) 在构造函数内部使用 Compare 仿函数来执行比较操作以确定元素的顺序。在添加元素后通过调用 adjust_down 函数来构建堆。
成员函数 adjust_up(size_t child) 在上浮操作中使用 Compare 仿函数执行比较以确定是否需要交换父子节点的位置从而保持堆的性质。
成员函数 push(const T x) 在插入操作中首先将新元素添加到底层容器 _con然后通过调用 adjust_up 函数来执行上浮操作保证新元素位于合适的位置。
成员函数 adjust_down(size_t parent) 在下沉操作中使用 Compare 仿函数执行比较以确定是否需要交换父子节点的位置从而保持堆的性质。
成员函数 pop() 在删除操作中首先将顶部元素与底层容器的最后一个元素交换然后通过调用 adjust_down 函数来执行下沉操作保证堆的性质。
成员函数 const T top() 通过返回 _con[0]获取优先队列的顶部元素。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89949.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!