C ++和优先级队列中的比较器

时间:2012-11-28 03:21:17

标签: c++

  

可能重复:
  Can inner classes access private variables?

所以我正在尝试使用优先级队列,并且在此队列的上下文中,我想要将整数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的情况下解决这个问题。

谢谢!

2 个答案:

答案 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
  ..
}