使用 .*& 访问基类成员(访问priority_queue容器)



我想从

中理解下面的代码如何迭代priority_queue?

我收集,因为HackedQueue是从priority_queue私有派生的,它可以访问它的私有。因此,我假设*&HackedQueue::c返回基类对象的地址,并且调用q。虽然不完全清楚,但更不清楚它是如何有效的语法。


提到priority_queue,我想知道是否仍然没有更干净的解决方案。例如,此链接上的第4个c'键

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;
}

我试图从

理解下面的代码

让我们用点数:

  • .*是指针到成员的访问操作符。见https://en.cppreference.com/w/cpp/language/operator_member_access
  • 代码使用priority_queue内部表示,它使用队列使用的底层容器来存储数据并使用名称为cprotected成员访问该数据。
    • From glibc stl_queue.h:

      class priority_queue
      {
      ...
      protected:
      //  See queue::c for notes on these names.
      _Sequence  c;
      _Compare   comp;
      
    • 请参阅queue::c中关于为什么它只是命名为c的注释。和c++ 98标准。

  • HackedQueue继承自priority_queue,所以它可以访问protected成员,
  • &HackedQueue::c是指向HackedQueuec成员的指针(它继承自priority_queue),
  • q.*(&HackedQueue::c);使用指向成员的指针访问对象q中的成员c
  • ,然后函数返回对传递对象q中该成员的引用。

什么是&&

右值引用声明符。见https://en.cppreference.com/w/cpp/language/reference

如何调试优先级队列,其基本需求是打印其元素?

带有调试器。无论如何,这个问题也回答在链接的问题如何迭代优先级队列?.

最新更新