C++ STL中的priority_queue value_type
C++ STL中的priority_queue是一种优先队列容器,它按照优先级对元素进行存储和访问。priority_queue的元素类型由value_type定义,这种类型的定义可以是基本类型,也可以是自定义类型。
value_type
value_type是priority_queue类型的一个关键特性,它定义了容器中存储元素的类型。在使用priority_queue时需要明确value_type类型,否则无法正确读取和修改元素。
基本类型的value_type
当使用基本类型作为priority_queue的value_type时,需要提供一个比较函数,以便确定元素的优先级。比较函数可以使用一个函数指针、一个lambda表达式、或者一个仿函数来实现。
下面是一个基于整数的priority_queue的示例代码:
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int> pq1;
priority_queue<int, vector<int>, greater<int>> pq2;
pq1.push(3);
pq1.push(1);
pq1.push(4);
pq2.push(3);
pq2.push(1);
pq2.push(4);
cout << pq1.top() << endl; // 输出4
cout << pq2.top() << endl; // 输出1
return 0;
}
在这个示例代码中,定义了两个priority_queue类型的对象pq1和pq2。它们的value_type都是int,但是pq2使用了一个比较函数,使得它的元素以升序排列。在输出top()的时候,pq1输出了4,而pq2输出了1。
自定义类型的value_type
当使用自定义类型作为priority_queue的value_type时,需要提供一个比较函数,它将判断元素的优先级。比较函数的定义可以在类内部,也可以在类外部。在类内部定义比较函数时,可以使用operator<来定义小于号。在类外部定义比较函数时,它需要是一个函数对象,可以是一个lambda表达式,也可以是一个仿函数。
下面是一个基于自定义类型的priority_queue的示例代码:
#include <iostream>
#include <queue>
using namespace std;
struct Person {
string name;
int age;
bool operator<(const Person& other) const {
return age < other.age;
}
};
struct ComparePerson {
bool operator()(const Person& p1, const Person& p2) const {
return p1.age < p2.age;
}
};
int main() {
priority_queue<Person> pq1;
priority_queue<Person, vector<Person>, ComparePerson> pq2;
pq1.push({"Tom", 18});
pq1.push({"Jerry", 21});
pq1.push({"Harry", 25});
pq2.push({"Tom", 18});
pq2.push({"Jerry", 21});
pq2.push({"Harry", 25});
cout << pq1.top().name << endl; // 输出Harry
cout << pq2.top().name << endl; // 输出Tom
return 0;
}
在这个示例代码中,定义了两个priority_queue类型的对象pq1和pq2。它们的value_type都是Person类型,但是pq2使用了一个比较函数ComparePerson,使得它的元素以升序排列。在输出top()的时候,pq1输出了Harry,而pq2输出了Tom。
结论
在使用C++ STL中的priority_queue时,需要注意value_type的类型定义和比较函数的实现。基本类型的value_type需要提供比较函数,而自定义类型的value_type需要定义小于号或者提供比较函数。掌握了value_type和比较函数的相关知识,可以更加灵活地使用priority_queue这个优先队列容器。