所以我正在尝试使用优先级队列,并且在此队列的上下文中,我想要将整数i定义为“小于”另一个整数j,如果D [i]< d [J]。我怎样才能做到这一点? (D是对象的数据成员)
到目前为止我已经
了/* This function gets the k nearest neighbors for a user in feature
* space. These neighbors are stored in a priority queue and then
* transferred to the array N. */
void kNN::getNN() {
int r;
priority_queue<int, vector<int>, CompareDist> NN;
/* Initialize priority queue */
for (r = 0; r < k; r++) {
NN.push(r);
}
/* Look at the furthest of the k users. If current user is closer,
* replace the furthest with the current user. */
for (r = k; r < NUM_USERS; r++) {
if (NN.top() > r) {
NN.pop();
NN.push(r);
}
}
/* Transfer neighbors to an array. */
for (r = 0; r < k; r++) {
N[r] = NN.top();
NN.pop();
}
}
在kNN.hh:
class kNN {
private:
struct CompareDist {
bool operator()(int u1, int u2) {
if (D[u1] < D[u2])
return true;
else
return false;
}
};
...
然而,这给了我错误
kNN.hh: In member function ‘bool kNN::CompareDist::operator()(int, int)’:
kNN.hh:29: error: invalid use of nonstatic data member ‘kNN::D’
我该怎么办?如果我在比较器中引用特定对象,C ++似乎不喜欢它,但我不知道如何在不参考D的情况下解决这个问题。
谢谢!
答案 0 :(得分:4)
您可以将D
对象的引用传递给CompareDist
对象的构造函数,然后在D
中使用该operator()
对象。
在此示例中,我存储了指向D
的指针。根据{{1}}的类型,您可能希望存储D
的副本。 (如果D
是原始数组,则可以简化我的示例中的语法。)
D
答案 1 :(得分:-1)
好的,现在我已经更好地阅读了您的问题,我可以更新答案:问题是D
是一个包含在kNN
实例中的对象,因此它不是{ {1}}并且无法从静态上下文访问。
您可以通过在类中使用对D的静态引用来解决问题,例如
static
此外,签名应使用const引用的元素,例如
// .h
class kNN {
static Type* current;
..
struct CompareDist {
bool operator()(int u1, int u2) {
if ((*current)[u1] < (*current)[u2])
return true;
else
return false;
}
};
}
// .cpp
Type *kNN::current = NULL;
void kNN::method()
{
kNN::current = D; // beforing using the comparator
..
}