优先级队列是一种容器适配器,经过专门设计,使得队列的第一个元素在队列中的所有元素中占最大。
priority_queue::emplace()
此函数用于将新元素插入优先级队列容器,该新元素将添加到优先级队列的顶部。
用法:
priorityqueuename.emplace(value) 参数: The element to be inserted into the priority queue is passed as the parameter. Result: The parameter is added to the priority queue at the top position.
例子:
Input :mypqueue{5, 4}; mypqueue.emplace(6); Output:mypqueue = 6, 5, 4 Input :mypqueue{}; mypqueue.emplace(4); Output:mypqueue = 4
注意:在priority_queue容器中,这些元素以相反的顺序打印,因为先打印顶部,然后再移动到其他元素。
错误和异常
1.它具有强大的异常保证,因此,如果引发异常,则不会进行任何更改。
2.参数应与容器的类型相同,否则将引发错误。
// INTEGER PRIORITY QUEUE
// CPP program to illustrate
// Implementation of emplace() function
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<int> mypqueue;
mypqueue.emplace(1);
mypqueue.emplace(2);
mypqueue.emplace(3);
mypqueue.emplace(4);
mypqueue.emplace(5);
mypqueue.emplace(6);
// queue becomes 1, 2, 3, 4, 5, 6
// printing the priority queue
cout << "mypqueue = ";
while (!mypqueue.empty()) {
cout << mypqueue.top() << " ";
mypqueue.pop();
}
return 0;
}
输出:
mypqueue = 6 5 4 3 2 1
// CHARACTER PRIORITY QUEUE
// CPP program to illustrate
// Implementation of emplace() function
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<char> mypqueue;
mypqueue.emplace('A');
mypqueue.emplace('b');
mypqueue.emplace('C');
mypqueue.emplace('d');
mypqueue.emplace('E');
mypqueue.emplace('f');
// queue becomes A, b, C, d, E, f
// printing the priority queue
cout << "mypqueue = ";
while (!mypqueue.empty()) {
cout << mypqueue.top() << " ";
mypqueue.pop();
}
return 0;
}
输出:
mypqueue = f d b E C A
// STRING PRIORITY QUEUE
// CPP program to illustrate
// Implementation of emplace() function
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main()
{
priority_queue<string> mypqueue;
mypqueue.emplace("portal");
mypqueue.emplace("computer science");
mypqueue.emplace("is a");
mypqueue.emplace("GEEKSFORGEEKS");
// queue becomes portal, computer scince,
// is a, GEEKSFORGEEKS
// printing the priority queue
cout << "mypqueue = ";
while (!mypqueue.empty()) {
cout << mypqueue.top() << " ";
mypqueue.pop();
}
return 0;
}
输出:
mypqueue = portal is a computer science GEEKSFORGEEKS
应用:
给定多个整数,使用emplace()将它们添加到优先级队列中,并找到优先级队列的大小。
Input:5, 13, 0, 9, 4 Output:5
算法
1.使用emplace()一次将给定元素插入优先级队列容器。
2.继续弹出优先级队列的元素,直到其变空,然后递增计数器变量。
3.打印计数器变量。
// CPP program to illustrate
// Application of emplace() function
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int c = 0;
// Empty Priority Queue
priority_queue<int> pqueue;
// inserting elements into priority_queue
pqueue.emplace(5);
pqueue.emplace(13);
pqueue.emplace(0);
pqueue.emplace(9);
pqueue.emplace(4);
// Priority queue becomes 13, 9, 5, 4, 0
// Counting number of elements in queue
while (!pqueue.empty()) {
pqueue.pop();
c++;
}
cout << c;
}
输出:
5
时间复杂度:O(1)
emplace()和push()
当我们使用push()时,我们创建一个对象,然后将其插入priority_queue。使用emplace(),该对象就地构建并保存不必要的副本。有关详细信息,请参见C++ STL中的emplace vs insert。
// C++ code to demonstrate difference between
// emplace and insert
#include<bits/stdc++.h>
using namespace std;
int main()
{
// declaring priority queue
priority_queue<pair<char, int>> pqueue;
// using emplace() to insert pair in-place
pqueue.emplace('a', 24);
// Below line would not compile
// pqueue.push('b', 25);
// using push() to insert pair
pqueue.push(make_pair('b', 25));
// printing the priority_queue
while (!pqueue.empty()) {
pair<char, int> p = pqueue.top();
cout << p.first << " "
<< p.second << endl;
pqueue.pop();
}
return 0;
}
输出:
b 25 a 24
相关用法
- C++ map emplace()用法及代码示例
- C++ set::emplace()用法及代码示例
- C++ stack emplace()用法及代码示例
- C++ multimap::emplace()用法及代码示例
- C++ unordered_map emplace()用法及代码示例
- C++ queue::emplace()用法及代码示例
- C++ multiset::emplace()用法及代码示例
- C++ deque emplace用法及代码示例
- C++ vector emplace()用法及代码示例
- C++ list emplace()用法及代码示例
- C++ unordered_multimap emplace()用法及代码示例
- C++ unordered_multiset emplace()用法及代码示例
- C++ unordered_set emplace()用法及代码示例
注:本文由纯净天空筛选整理自AyushSaxena大神的英文原创作品 priority_queue emplace() in C++ STL。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。