赞
踩
简单的理解容器适配器,其就是将不适用的序列式容器(包括 vector、deque 和 list)变得适用。
如果你希望你的queue是list那么可以如下创建:
std::queue<int , std::list<int>> q;
可以直接通过 queue 容器适配器来初始化另一个 queue 容器适配器,只要它们存储的元素类型以及底层采用的基础容器类型相同即可。例如:
std::deque<int> values{1,2,3};
std::queue<int> my_queue1(values);
std::queue<int> my_queue(my_queue1);
//或者使用
//std::queue<int> my_queue = my_queue1;
template <typename T,
typename Container=std::vector<T>,
typename Compare=std::less<T> >
class priority_queue {
//......
}
//以使用普通数组或其它容器中指定范围内的数据,对 priority_queue 容器适配器进行初始化:
int values[]{4,1,3,2};
std::priority_queue<int> copy_values(values, values+4); // 4,3,2,1
//使用序列式容器
std::vector<int> vec{1,5,3,4,2}
std::priority_queue<int> pq(vec.begin(), vec.end()); // 5,4,3,2,1
//还可以手动指定 priority_queue 使用的底层容器以及排序规则,比如
std::vector<int> vec{1,5,3,4,2};
std::priority_queue<int, std::vector<int>, std::greater<int>> pq(vec.begin(), vec.end());
std::priority_queue<int, std::vector<int>, std::greater<int>> pq1{2,3,4,1,5};
- 1
std::vector<int> vec1{1,5,3,4,2};
std::priority_queue<int, std::vector<int>, std::greater<int>> pq(vec1.begin(), vec1.end());
while (!pq.empty()) {
std::cout<< pq.top()<<std::endl;
pq.pop();
}
/*
1
2
3
4
5
*/
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
std::priority_queue<int,std::vector<int>, myFun> pq3(vec1.begin(), vec1.end());
while (!pq3.empty()) {
std::cout<< pq3.top()<<std::endl;
pq3.pop();
}
/*
1
2
3
4
5
*/
std::priority_queue<tmp1> qp2; tmp1 t1{2}; tmp1 t11{3}; tmp1 t111{1}; tmp1 t1111{4}; qp2.push(t1); qp2.push(t11); qp2.push(t111); qp2.push(t1111); while (!qp2.empty()) { std::cout<< qp2.top().x<<std::endl; qp2.pop(); } /* 5 4 3 2 1 */ std::priority_queue<tmp1> qp2;
auto cmp = [](int a, int b) -> bool { return a < b;};
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq4(vec1.begin(), vec1.end(),cmp);
while (!pq4.empty()) {
std::cout<< pq4.top()<<std::endl;
pq4.pop();
}
/*
5
4
3
2
1
*/
前面提到的自定义比较函数-lambda, 其实传入的是一个函数指针,什么意思呢?
你可以这样写效果是一样的:
auto cmp = [](int a, int b)-> bool { return a < b; };
std::priority_queue<int, std::vector<int>, std::function<bool(int,int)>> pq5(vec1.begin(), vec1.end(), cmp);
while (!pq5.empty()) {
std::cout<< pq5.top()<<std::endl;
pq5.pop();
}
但是你不可以这样写:
std::priority_queue<int, std::vector<int>, decltype(cmp(1,2))> pq4(vec1.begin(), vec1.end(),cmp);
//decltype(cmp(1,2))的到的是bool,而不是函数指针
小问题,好吧,是我理解的不够。
本来准备单独用一章写,但是看了一下,其实底层实现就是一个堆,特点:
做完下溯操作后,可能还需做一次上溯操作
参考: https://blog.csdn.net/youaremyalllove/article/details/124043310
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。