重载[]运算符:必须是非静态成员函数

时间:2015-07-15 05:03:41

标签: c++ algorithm operator-overloading

我正在使用Graphs,并编写一些众所周知的算法代码。目前我正在研究Dijkstra算法。

所以,我创建了自己的Heap类,它作为Dijkstra算法实现的最小优先级队列。因为在Dijkstra算法中,你需要从图中的源顶点更新顶点(已经在堆中)的距离,如果它的距离小于它的当前距离,然后相应地调整堆中的值。

为此,我需要保留一个int position[]数组来跟踪元素当前在Heap

中的位置

这是我的Vertex Class ::

    class Node{
    public:
        int data;
        int weight;

        .....

        friend int& operator [](int *a, Node i) {
            return a[i.data];
        }
    };

我的minPriorityQueue类::

template <typename t>
class minPriorityQueue {
    int size, currentPosition;
    int *position;
    t *data;
    bool (*compare)(t data1, t data2);
public:
    minPriorityQueue(int size, bool (*func1)(t data1, t data2), int *position) {
        this->size = size;
        currentPosition = 1;
        data = new t[size];
        compare = func1;
        this->position = position;
    }

   ........

    void swapPositionValue(int parent, int temp) {
        int tempPosition = position[data[parent]];
        position[data[parent]] = position[data[temp]];
        position[data[temp]] = tempPosition;
    }    

    ......
};

因为我的顶点是0,1,2,3, ...所以,我尝试重载我的[]operator类的Vertex,以便它返回当前顶点的data(这是一个来自0,1,2,3 ...,因此我可以使用它来访问position数组的索引。

我收到编译错误:: error: 'int operator[](int*, graph::Vertex)' must be a nonstatic member function 好吧,既然我得到了这个错误,我认为必须在标准中指定我不能使用友元函数重载[]operator,但为什么我不能这样做?这会导致任何含糊不清的行为吗?我看不出我目前使用的含糊不清的内容。

其次,有没有办法可以交换position数组中的值?我的minPriorityQueue类是一个泛型类,我也在我的代码中的其他几个地方使用它。在函数swapPositionValue中,如果我将交换语句更改为此::

    int tempPosition = position[data[parent].data];
    position[data[parent].data] = position[data[temp].data];
    position[data[temp].data] = tempPosition;

然后牺牲了“通用”优先级队列的整个想法!因为,它不适用于其他类!

有没有办法可以实现这个功能?

EDIT1 ::完整的代码:: http://ideone.com/GRQHHZ (使用Ideone粘贴代码,因为代码仍然非常大,包含2个类)

这就是我想要实现的目标:: http://www.geeksforgeeks.org/greedy-algorithms-set-7-dijkstras-algorithm-for-adjacency-list-representation/ (我只是使用算法)

解释operator[]的功能是什么:: 在我的Dijkstra实现中,所有节点最初都插入到Heap中,其中起始节点具有weight = 0,而所有其他节点都具有weight = INFINITY(这意味着我无法到达顶点)所以启动顶点是堆中最重要的元素!现在,当我删除最顶层的元素时,所有已删除的节点中包含路径的Node都将被修改,其weight将从INFINITY修改为某个有限值。所以,我需要更新堆中的节点,然后我需要根据他们的新权重将它们移动到正确的位置!要更新权重,我需要知道Heap中节点的位置,并且位置由data的{​​{1}}决定。因此,重载Node对我来说只是一个小小的出路,所以当我[]operator时,我可以访问position[Node]

为什么这不重复 ::链接的问题是一个广泛的运算符重载帖子,它只提到1点,它指出position[Node.data]只能用成员函数重载不然,不说明原因!这是我面临的一个具体问题,我不想牺牲自制Heap的通用属性,也可以将它用于Dijkstra。

EDIT2 ::在写这个解释时,我意识到我在我的重载函数中犯了一个大错误。我改变了它!请检查一下。可能现在更有意义。的道歉!!

重载函数现在看起来像::

[]operator

EDIT3 ::在使用friend int& operator [](int *a, Node i) { return a[i.data]; } 实现我的Graph类时,它是一个布尔2D数组,因为我当前的实现是针对未加权的图形,因此最短的路径成为遍历的边数最少! (以防万一重要!)

感谢阅读所有这个大问题,并提供任何帮助! :)

0 个答案:

没有答案