C++ STL中的priority_queue的emplace()方法
在C++ STL中,priority_queue是一种基于堆的数据结构,它提供了一种以最大值(默认情况下)为优先级的队列,优先级最高的元素总是在队首。在实际应用中,priority_queue是一种非常有用的数据结构,它可以帮助我们对一些数据进行排序和处理。
在使用priority_queue时,经常需要向队列中插入元素。STL提供了push()方法来实现向队列中插入元素,但是,这需要我们提前创建好一个元素对象。而如果我们希望动态地创建一个元素对象,将其插入到队列中,那就需要使用emplace()方法。
priority_queue emplace()方法的定义
emplace()方法的定义如下:
template<class... Args>
void emplace(Args&&... args);
该方法可以接受任意数量和类型的参数,用于创建和初始化插入的元素对象。
priority_queue emplace()方法的示例
下面让我们通过一个示例来演示如何使用emplace()方法向priority_queue中插入元素。我们将创建一个priority_queue对象,其中包含一些自定义的Person对象,每个Person对象由名字和年龄两个属性组成。
#include <iostream>
#include <queue>
#include <string>
using namespace std;
struct Person {
string name;
int age;
Person(string _name, int _age) : name(_name), age(_age) {}
};
struct PersonCmp {
bool operator() (const Person& a, const Person& b) const {
return a.age < b.age;
}
};
int main() {
priority_queue<Person, vector<Person>, PersonCmp> pq;
pq.emplace("Alice", 25);
pq.emplace("Bob", 30);
pq.emplace(Person("Charlie", 20));
while (!pq.empty()) {
cout << pq.top().name << " " << pq.top().age << endl;
pq.pop();
}
return 0;
}
上述示例中,我们首先定义了一个Person结构体,用于存储人员的信息。为了让Person对象可以作为priority_queue中的元素,我们还定义了一个PersonCmp类,用于定义元素之间的比较关系。在main函数中,我们创建了一个pq对象,它是由Person对象组成的一种基于堆的优先队列。
在插入元素的时候,我们使用了emplace()方法向priority_queue中动态插入了3个Person对象。第一个Person对象是由姓名和年龄直接构造出来的,第二个Person对象仅由名字构造,年龄则在后面用赋值操作进行初始化,第三个Person对象通过一个Person结构体构造器来初始化。可以看到,借助emplace()方法,我们可以非常方便地向priority_queue中动态插入元素,不用提前定义好元素对象。
在对priority_queue进行遍历时,我们总是可以先通过调用top()方法获取队首元素,然后再使用pop()方法将元素从队列中移除。由于我们在PersonCmp中定义了按年龄升序排序的策略,因此队列中的元素在输出时会按照年龄升序排列。
结论
priority_queue是STL中非常有用的一个数据结构,在实际应用中,可以为程序提供非常方便的队列处理功能。借助emplace()方法,我们可以动态地向priority_queue插入元素,而无需提前创建好元素对象。需要注意的是,在使用emplace()方法时,我们需要为元素对象定义好相应的构造函数,以便能够通过可变参数来正确地构造和初始化元素对象。