std::priority_queue是一种容器适配器,它内部的元素是按顺序排列的,默认情况下最大元素总是在队列顶部。可以自定义Compare来改变元素的排列顺序。
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
本文章的代码库:
https://gitee.com/gamestorm577/CppStd
成员函数
构造、析构和赋值
构造函数
可以构造一个空的priority_queue,也可以用对应的容器或者另一个priority_queue来构造一个priority_queue。代码示例:
std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1;
std::priority_queue<int, std::vector<int>> pq2(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq3(pq2);
std::cout << "pq1 size = " << pq1.size() << std::endl;
std::cout << "pq2 size = " << pq2.size() << std::endl;
std::cout << "pq3 size = " << pq3.size() << std::endl;
输出结果:
pq1 size = 0
pq2 size = 3
pq3 size = 3
析构函数
销毁priority_queue时,会调用各元素的析构函数。代码示例:
struct MyStruct
{
MyStruct(int i)
: Num(i)
{
}
~MyStruct()
{
std::cout << "~MyStruct: " << Num << std::endl;
}
int Num = 0;
};
auto comp = [](const MyStruct& lhs, const MyStruct& rhs) -> bool
{
return lhs.Num < rhs.Num;
};
std::vector<MyStruct> tmp{1, 2, 3};
std::priority_queue<MyStruct, std::vector<MyStruct>, decltype(comp)> pq(
comp, std::move(tmp));
std::cout << "end\n";
输出结果:
~MyStruct: 3
~MyStruct: 2
~MyStruct: 1
~MyStruct: 1
end
~MyStruct: 3
~MyStruct: 2
~MyStruct: 1
赋值函数
可以用另一个priority_queue给priority_queue赋值。代码示例:
std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq2;
pq2 = pq1;
std::cout << "pq2 size = " << pq2.size() << std::endl;
输出结果:
pq2 size = 3
元素访问
top
获取队列顶部元素的const引用。代码示例:
std::vector<int> tmp{3, 1, 2};
std::priority_queue<int, std::vector<int>> pq(std::less<int>(), tmp);
std::cout << "pq top: " << pq.top() << std::endl;
输出结果:
pq top: 3
容量
empty
检查priority_queue是否为空。代码示例:
std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq2;
std::cout << std::boolalpha;
std::cout << "pq1 empty: " << pq1.empty() << std::endl;
std::cout << "pq2 empty: " << pq2.empty() << std::endl;
输出结果:
pq1 empty: false
pq2 empty: true
size
返回priority_queue中元素的个数。代码示例:
std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq2;
std::cout << "pq1 size: " << pq1.size() << std::endl;
std::cout << "pq2 size: " << pq2.size() << std::endl;
输出结果:
pq1 size: 3
pq2 size: 0
修改器
push
插入元素到priority_queue中并对元素进行排序。代码示例:
std::priority_queue<int, std::vector<int>> s;
s.push(3);
s.push(4);
s.push(1);
s.push(2);
std::cout << "s top: " << s.top() << std::endl;
输出结果:
s top: 4
emplace
构造一个元素到priority_queue中并对元素进行排序。代码示例:
struct MyStruct
{
MyStruct(int i)
{
std::cout << "MyStruct: " << i << std::endl;
}
};
auto comp = [](const MyStruct& lhs, const MyStruct& rhs) -> bool
{
return true;
};
std::priority_queue<MyStruct, std::vector<MyStruct>, decltype(comp)> pq;
pq.emplace(1);
pq.emplace(2);
pq.emplace(3);
输出结果:
MyStruct: 1
MyStruct: 2
MyStruct: 3
pop
移除队列的首个元素。代码示例:
std::priority_queue<int, std::vector<int>> s;
s.push(4);
s.push(1);
s.push(3);
s.push(2);
while (!s.empty())
{
std::cout << "num: " << s.top() << std::endl;
s.pop();
}
输出结果:
num: 4
num: 3
num: 2
num: 1
swap
和另一个priority_queue交换元素内容。代码示例:
std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{1, 2};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp1);
std::priority_queue<int, std::vector<int>> pq2(std::less<int>(), tmp2);
pq1.swap(pq2);
std::cout << "pq1 size = " << pq1.size() << std::endl;
std::cout << "pq2 size = " << pq2.size() << std::endl;
输出结果:
pq1 size = 2
pq2 size = 3
非成员函数
swap
交换两个priority_queue的元素内容。代码示例:
std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{1, 2};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp1);
std::priority_queue<int, std::vector<int>> pq2(std::less<int>(), tmp2);
std::swap(pq1, pq2);
std::cout << "pq1 size = " << pq1.size() << std::endl;
std::cout << "pq2 size = " << pq2.size() << std::endl;
输出结果:
pq1 size = 2
pq2 size = 3