C++ STL中的priority_queue value_type

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这个优先队列容器。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程