Я пытаюсь закодировать алгоритм Dijktra небольшого масштаба с использованием карты, очереди и списка. Я знаю много проблем с этим кодом, но на данный момент я в основном обеспокоен перегрузкой оператора + для добавления к объектам. Я не знаком с перегрузкой, и любая помощь будет очень признательна. Я пытаюсь добавить два объекта (узлы) на основе стоимости частного члена, которая является целым числом.operator + overload C++
Вот мой код:
#include<iostream>
#include <map>
#include <queue>
#include <list>
using namespace std;
class node
{
public:
node();
node(char n, int l){
name = n; cost =l;}
void display()const{cout<<"name = "<<name<<" cost = "<<cost<<"\n";}
char getName()const{return name;}
int getCost() {return cost;}
node operator+(const node& n){node N1;N1.cost = this->cost + N1.cost; return N1;} //<---
private:
char name;
int cost;
};
bool operator<(node a, node b)
{
return a.getCost()> b.getCost();
}
int main()
{
map<node,node>::iterator mapItr;
map<node,node> myMap;
priority_queue<node> que;
list<node> solution;
list<node>::iterator listItr;
list<node> checkList;
node * nptr;
myMap.insert(pair<node, node>(node('A',5),node('B',5)));
myMap.insert(pair<node, node>(node('A',6),node('C',6)));
myMap.insert(pair<node, node>(node('B',3),node('C',3)));
myMap.insert(pair<node, node>(node('B',7),node('E',7)));
myMap.insert(pair<node, node>(node('C',2),node('E',2)));
myMap.insert(pair<node, node>(node('C',4),node('D',4)));
myMap.insert(pair<node, node>(node('D',5),node('E',5)));
myMap.insert(pair<node, node>(node('D',10),node('G',10)));
myMap.insert(pair<node, node>(node('E',9),node('G',9)));
myMap.insert(pair<node, node>(node('E',4),node('F',4)));
myMap.insert(pair<node, node>(node('F',2),node('G',2)));
solution.push_back(node('A',0));
do
{
listItr=solution.begin();
do
{ nptr = &*listItr;
for(mapItr=myMap.begin();mapItr!=myMap.end();mapItr++)
{
if(nptr->getName()==mapItr->first.getName())
{
que.push(mapItr->second);
}
}
if(nptr->getName()!= que.top().getName())
{
que.top()= (*que.top())+(*nptr);//<---- error here
solution.push_back(que.top());
que.pop();
listItr++;
solution.pop_front();
}
else
{que.pop();
listItr++;}
}
while(listItr!= solution.end());
}
while (!que.empty());
return 0;
}
Сообщение об ошибке:
не подходит для 'opeerator *' в «* que.std :: priorty_queue < _Tp, _sequence, _Compare> :: топ>()»
'que.top()' возвращает ссылку, а не указатель. Проблема заключается в попытке разыменовать его. – Kevin
Отредактировано ... достал ненужный код. Я думаю, что мне действительно нужно знать, как добавить стоимость первого элемента в P-очереди к стоимости решения? – bryan