📜  C++ STL中的priority_queue emplace()

📅  最后修改于: 2021-05-30 14:15:31             🧑  作者: Mango

优先级队列是一种容器适配器,经过专门设计,以使队列的第一个元素在队列中的所有元素中占最大比例。

priority_queue :: emplace()

此函数用于将新元素插入优先级队列容器,该新元素将添加到优先级队列的顶部。
句法 :

priorityqueuename.emplace(value)
Parameters :
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 
#include 
using namespace std;
  
int main()
{
    priority_queue 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 
#include 
using namespace std;
  
int main()
{
    priority_queue 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 
#include 
#include 
using namespace std;
  
int main()
{
    priority_queue 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 
#include 
using namespace std;
  
int main()
{
    int c = 0;
  
    // Empty Priority Queue
    priority_queue 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
using namespace std;
    
int main()
{
    // declaring priority queue
    priority_queue> 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 p =  pqueue.top();
        cout << p.first << " "
             << p.second << endl;
        pqueue.pop();
    }
    
    return 0;
}
输出:
b 25
a 24
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”