C++ 重载[]运算符:必须是非静态成员函数
我正在处理图形,并编写一些著名算法的代码。目前我正在研究Dijkstra算法 因此,我创建了自己的C++ 重载[]运算符:必须是非静态成员函数,c++,algorithm,operator-overloading,C++,Algorithm,Operator Overloading,我正在处理图形,并编写一些著名算法的代码。目前我正在研究Dijkstra算法 因此,我创建了自己的堆类,该类用作Dijkstra算法实现的最小优先级队列。因为,在Dijkstra算法中,如果顶点(已经在堆中)的距离小于其当前距离,则需要更新其与图形中源顶点的距离,然后相应地调整堆中的值 为此,我需要保留一个int position[]数组来跟踪元素当前在堆中的位置 这是我的顶点类:: class Node{ public: int data; in
堆
类,该类用作Dijkstra算法实现的最小优先级队列。因为,在Dijkstra算法中,如果顶点(已经在堆中)的距离小于其当前距离,则需要更新其与图形中源顶点的距离,然后相应地调整堆中的值
为此,我需要保留一个int position[]
数组来跟踪元素当前在堆中的位置
这是我的顶点类::
class Node{
public:
int data;
int weight;
.....
friend int& operator [](int *a, Node i) {
return a[i.data];
}
};
MyminPriorityQueue
class::
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;
}
......
};
然后,整个“通用”优先级队列的想法将被牺牲!因为,它不适用于其他类
有没有办法实现这个功能
EDIT1::完整代码:
(使用Ideone粘贴代码,因为代码仍然很大,包含2个类)
这就是我努力实现的目标:
(我只是在使用算法)
解释操作符[]
的功能:
在我的Dijkstra实现中,所有节点最初都插入到堆中,起始节点的权重为weight=0
,所有其他节点的权重为weight=INFINITY
(这意味着我无法到达顶点),因此起始顶点是堆的最顶层元素!现在,当我移除最上面的元素时,所有从移除的节点具有路径的节点将被修改,它们的权重将从无穷大
修改为某个有限值。因此,我需要更新堆中的节点,然后根据它们的新权重将它们移动到正确的位置!!要更新它们的权重,我需要知道节点位于堆中的什么位置,并且位置由节点的数据决定。因此,重载[]操作符
对我来说只是一个小办法,这样当我执行定位[Node]
时,我就可以访问定位[Node.data]
为什么这不是一个重复的::链接的问题是一个广泛的运算符重载帖子,它只提到了一点,说明[]运算符只能用成员函数重载,否则不能重载,但没有说明原因!这是我面临的一个特殊问题,我不想牺牲我自己制作的堆的泛型属性,并将其用于Dijkstra
EDIT2::在写这篇解释时,我意识到我在重载函数中犯了一个大错误。我改了!请检查一下。现在可能更有意义了道歉强>
重载函数现在看起来像::
friend int& operator [](int *a, Node i) {
return a[i.data];
}
EDIT3:在使用邻接矩阵实现我的图形
类中,它是一个布尔2D数组,因为我当前的实现是针对未加权的图形,因此最短路径成为遍历的边数最少!(以防万一这很重要!)
感谢您阅读所有这些巨大的问题,并感谢您的帮助!:) 向我们显示导致此错误的代码。否则,我们无法告诉您它有什么问题。是的,并删除所有其他代码。顺便说一句:你想要重载它的目的是不相关的,标准库已经包含了一个堆,这可能是一个很好的替代方法。你的操作符[]
甚至没有意义。它必须是一个成员函数,其中一个参数是调用者将放置在[]
中的参数。你的版本有一个额外的参数a
,它甚至没有使用,并且不是成员函数。请将第二个问题移至其他帖子。这和你的第一次完全无关。好吧,也许我了解一点你想做什么!虽然写得很随意!无论你做什么,你都不能使用操作符重载来实现,这是我可以从附加的链接和评论中看出的,因为这是不允许的!您可以尝试做的另一件事是向类传递另一个函数指针,当您需要交换位置时,只需使用所需的参数调用该函数。当您不需要它时,只需将该函数指针指定为NULL。我想这就是你需要的!
friend int& operator [](int *a, Node i) {
return a[i.data];
}