Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优先级\使用访问另一类字段的比较器的队列类字段_C++_Priority Queue - Fatal编程技术网

C++ 优先级\使用访问另一类字段的比较器的队列类字段

C++ 优先级\使用访问另一类字段的比较器的队列类字段,c++,priority-queue,C++,Priority Queue,您好,我需要创建一个包含优先级队列字段的类,其comparator函数需要访问该类中的另一个字段。简而言之,我需要这样写: class A { B foo; priority_queue<C,vector<C>,comparator> bar; } 是否有可能以某种方式获得此结果,以及我必须在何处定义比较器函数?有两个步骤来完成此操作 首先,比较器需要一个构造函数来保存对a class comparator { A &a; publ

您好,我需要创建一个包含优先级队列字段的类,其comparator函数需要访问该类中的另一个字段。简而言之,我需要这样写:

class A
{
    B foo;
    priority_queue<C,vector<C>,comparator> bar;
}

是否有可能以某种方式获得此结果,以及我必须在何处定义比较器函数?

有两个步骤来完成此操作

首先,比较器需要一个构造函数来保存对
a

class comparator {

     A &a;

public:
     comparator(A &a_arg) : a(a_arg)
     {
     }

     bool operator()(const C &first, const C &second) const
     {
          // The comparator can use "a" to access the contents of the
          // A class.
     }
};
第二步是
A
的构造函数使用一个显式的
比较器来初始化它的
优先级队列成员,该比较器是由
*this
构造的:

A::A() : bar(comparator(*this))
{
   // ...
}

注意:请记住比较器中对该
的引用。如果复制了
A
的实例,则
引用在副本中无效。你的
A
类应该有一个
delete
d复制构造函数,或者有一个显式复制构造函数来初始化所构造的副本
A
优先级队列

执行此操作需要两个步骤

首先,比较器需要一个构造函数来保存对
a

class comparator {

     A &a;

public:
     comparator(A &a_arg) : a(a_arg)
     {
     }

     bool operator()(const C &first, const C &second) const
     {
          // The comparator can use "a" to access the contents of the
          // A class.
     }
};
第二步是
A
的构造函数使用一个显式的
比较器来初始化它的
优先级队列成员,该比较器是由
*this
构造的:

A::A() : bar(comparator(*this))
{
   // ...
}

注意:请记住比较器中对该
的引用。如果复制了
A
的实例,则
引用在副本中无效。你的
A
类应该有一个
delete
d复制构造函数,或者一个显式的复制构造函数来初始化所构造的
A
优先级队列

使用捕获lambda作为比较器。@RichardCriten已经尝试捕获lambda(
[&]
,如果我正确的话),但是它给了我以下错误:
“这”不是为这个lambda函数捕获的。我还试图定义一个存储lambda函数的自动字段,但我得到了相同的错误。使用捕获lambda作为比较器。@RichardCriten已经尝试捕获lambda(
[&]
,如果我正确的话),但它给了我以下错误:
此lambda函数未捕获“this”。我还试图定义一个存储lambda函数的自动字段,但我得到了相同的错误。如果我使用此方法,我在前向声明两个类中的一个时会遇到问题,但我不能,因为我使用的前向类没有指针或引用(分别在operator()方法和priority_queue字段声明中)。我应该将A引用更改为指针吗?指针或引用没有区别。仅在
比较器
类声明中声明
运算符()
,然后在定义主类后定义它(使用
内联
)。问题解决了。它现在可以工作了,虽然在我看来有点复杂。无论如何,谢谢你的帮助。先生,USSRe6060875——没有人曾经指责C++是简单的。如果我使用这个方法,我就有问题向前声明这两个类中的一个,但是我不能,因为我使用没有指针或引用的转发类(分别在操作程序()中,在PrimRythyQuealEngfield声明中)。我应该将A引用更改为指针吗?指针或引用没有区别。仅在
比较器
类声明中声明
运算符()
,然后在定义主类后定义它(使用
内联
)。问题解决了。它现在可以工作了,虽然在我看来有点复杂。不管怎样,谢谢你的帮助。先生@ USER 360875——没有人曾经指责C++是简单的。