【发布时间】:2021-10-30 21:34:22
【问题描述】:
我试图从以下代码中理解
How to iterate over a priority_queue?
我认为,由于 HackedQueue 是从 priority_queue 私有派生的,因此它可以访问其私有数据。所以,我假设*&HackedQueue::c 返回基类对象的地址,并且它被调用为 q。不过,并不完全清楚,甚至更清楚它是如何成为有效语法的。
提到priority_queue,我想知道是否仍然没有更干净的解决方法。例如,此链接上的 4th c'tor
priority_queue( const Compare& compare, Container&& cont );
https://en.cppreference.com/w/cpp/container/priority_queue/priority_queue
似乎提供了一个可以使用的容器,而不是只读输入。我在visual studio头文件中看不到它,我不清楚&&是什么。
相关,我不明白反对的问题,例如为什么我需要访问私有容器,它不是为此而设计的。那么,如何调试优先级队列,基本需要打印其元素?
#include <queue>
#include <cstdlib>
#include <iostream>
using namespace std;
template <class T, class S, class C>
S& Container(priority_queue<T, S, C>& q) {
struct HackedQueue : private priority_queue<T, S, C> {
static S& Container(priority_queue<T, S, C>& q) {
return q.*&HackedQueue::c;
}
};
return HackedQueue::Container(q);
}
int main()
{
priority_queue<int> pq;
vector<int> &tasks = Container(pq);
cout<<"Putting numbers into the queue"<<endl;
for(int i=0;i<20;i++){
int temp=rand();
cout<<temp<<endl;
pq.push(temp);
}
cout<<endl<<"Reading numbers in the queue"<<endl;
for(vector<int>::iterator i=tasks.begin();i!=tasks.end();i++)
cout<<*i<<endl;
cout<<endl<<"Taking numbers out of the queue"<<endl;
while(!pq.empty()){
int temp=pq.top();
pq.pop();
cout<<temp<<endl;
}
return 0;
}
【问题讨论】:
-
这是
q.*(&HackedQueue::c)- 使用指向成员的指针的语法。但我什至没有试图理解这里发生了什么可怕的恐怖事件。 -
请每个 stackoverflow.com 问题一个问题。你能edit你的问题并提出一个single的问题,可以给出single的答案吗?
&&是一个右值参考,请参阅您的 C++ 教科书以获取更多信息和详细说明(Stackoverflow 并不能真正替代 C++ 教科书,如果有一些特定对于任何不清楚的主题,您可以询问并准确解释您想要澄清的内容,但对于一般教程和解释,我们建议人们参考他们的教科书)。 -
&HackedQueue::c是一个指向成员的指针 -c是priority_queue的底层容器成员。.*是“取消引用指向成员的指针”运算符。这些扭曲用于访问同一类的不同实例的受保护成员。 -
您的问题是什么?您是在问该代码是什么意思或您是在问
how do you debug a priority queue, where the basic need is to print its elements?或是什么&&是什么意思?请不要问多个问题。Mentioning priority_queue, I was wondering if...这部分是否与与您的问题相关或可以删除,这似乎是一个声明?
标签: c++