C++ 优先级\使用访问另一类字段的比较器的队列类字段
您好,我需要创建一个包含优先级队列字段的类,其comparator函数需要访问该类中的另一个字段。简而言之,我需要这样写: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
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++是简单的。