编写相邻列表图时出现未知错误
Unknown Error While Writing An Adjacent List Graph
我正在写一个带有加权边的基于列表的相邻图。我的目标是实现一个图形来测试 Djikstra 的最短路径算法。当我实现 removeEdge 函数时,我遇到了麻烦。我查看了构建消息,但我不知道下面的错误是什么。
下面这个警告之前有一些警告,但在编译时它们很小,运行 没问题。
c:\program files (x86)\codeblocks\mingw\bin..\lib\gcc\mingw32.7.1\include\c++\bits\list.tcc||In instantiation of 'void std::list<_Tp, _Alloc>::remove(const value_type&) [with _Tp = Edge; _Alloc = std::allocator; std::list<_Tp, _Alloc>::value_type = Edge]':|
这是生成的错误。
c:\program files (x86)\codeblocks\mingw\bin..\lib\gcc\mingw32.7.1\include\c++\bits\list.tcc|249|error: no match for 'operator==' in '__first.std::_List_iterator<_Tp>::operator*() == __value'|
现在,代码:
#ifndef WEIGHTED_ADJACENT_LIST_GRAPH_H
#define WEIGHTED_ADJACENT_LIST_GRAPH_H
#include <list>
#include <forward_list>
#include <stack>
#include <string>
using namespace std;
typedef int Weight;
class Edge;
class Vertex {
friend class Edge;
int num;
string name;
public:
Vertex();
Vertex(int n, string v_name){
num = n;
name = v_name;
}
int getNum() const{
return num;
}
string getName() const{
return name;
}
void setNum(int new_num){
num = new_num;
}
void setName(string new_name){
name = new_name;
}
};
class Edge {
Weight weight;
Vertex src;
Vertex dest;
public:
Edge();
Edge(Vertex s, Vertex d, Weight w):src(s), dest(d),weight(w){}
/*
Edge(Vertex s, Vertex d, Weight w){
src = s;
dest = d;
weight = w;
}
*/
Weight getWeight() const{
return weight;
}
int getSrcNum() const{
return src.num;
}
int getDestNum() const{
return dest.num;
}
};
class AdjacentList{
int num_Vertices;
list<Edge> *adj;
public:
AdjacentList();
AdjacentList(int n){
num_Vertices = n;
}
void addEdge(Vertex &i, Edge &j){
adj[i.getNum()].push_back(j);
}
void removeEdge(Vertex &i, Edge j){
if(!adj[i.getNum()].empty())
{
adj[i.getNum()].remove(j);
}
else{
cerr<<"Adjacent list underflow in removeEdge function"<<endl;
}
}
};
#endif
请注意,此图不完整。还有很多功能需要在那里实现。有谁知道这个数据结构代码有什么问题吗?
你没有为 Edge
提供 operator==
,我不知道你想如何指定哪些 Edge
是相等的,但你需要像在使用 remove
之前定义如下
bool operator==(Edge const& lhs, Edge const& rhs)
{
return
lhs.getWeight() == rhs.getWeight() &&
lhs.getSrcNum() == rhs.getSrcNum() &&
lhs.getDestNum() == rhs.getDestNum();
}
我正在写一个带有加权边的基于列表的相邻图。我的目标是实现一个图形来测试 Djikstra 的最短路径算法。当我实现 removeEdge 函数时,我遇到了麻烦。我查看了构建消息,但我不知道下面的错误是什么。
下面这个警告之前有一些警告,但在编译时它们很小,运行 没问题。
c:\program files (x86)\codeblocks\mingw\bin..\lib\gcc\mingw32.7.1\include\c++\bits\list.tcc||In instantiation of 'void std::list<_Tp, _Alloc>::remove(const value_type&) [with _Tp = Edge; _Alloc = std::allocator; std::list<_Tp, _Alloc>::value_type = Edge]':|
这是生成的错误。
c:\program files (x86)\codeblocks\mingw\bin..\lib\gcc\mingw32.7.1\include\c++\bits\list.tcc|249|error: no match for 'operator==' in '__first.std::_List_iterator<_Tp>::operator*() == __value'|
现在,代码:
#ifndef WEIGHTED_ADJACENT_LIST_GRAPH_H
#define WEIGHTED_ADJACENT_LIST_GRAPH_H
#include <list>
#include <forward_list>
#include <stack>
#include <string>
using namespace std;
typedef int Weight;
class Edge;
class Vertex {
friend class Edge;
int num;
string name;
public:
Vertex();
Vertex(int n, string v_name){
num = n;
name = v_name;
}
int getNum() const{
return num;
}
string getName() const{
return name;
}
void setNum(int new_num){
num = new_num;
}
void setName(string new_name){
name = new_name;
}
};
class Edge {
Weight weight;
Vertex src;
Vertex dest;
public:
Edge();
Edge(Vertex s, Vertex d, Weight w):src(s), dest(d),weight(w){}
/*
Edge(Vertex s, Vertex d, Weight w){
src = s;
dest = d;
weight = w;
}
*/
Weight getWeight() const{
return weight;
}
int getSrcNum() const{
return src.num;
}
int getDestNum() const{
return dest.num;
}
};
class AdjacentList{
int num_Vertices;
list<Edge> *adj;
public:
AdjacentList();
AdjacentList(int n){
num_Vertices = n;
}
void addEdge(Vertex &i, Edge &j){
adj[i.getNum()].push_back(j);
}
void removeEdge(Vertex &i, Edge j){
if(!adj[i.getNum()].empty())
{
adj[i.getNum()].remove(j);
}
else{
cerr<<"Adjacent list underflow in removeEdge function"<<endl;
}
}
};
#endif
请注意,此图不完整。还有很多功能需要在那里实现。有谁知道这个数据结构代码有什么问题吗?
你没有为 Edge
提供 operator==
,我不知道你想如何指定哪些 Edge
是相等的,但你需要像在使用 remove
bool operator==(Edge const& lhs, Edge const& rhs)
{
return
lhs.getWeight() == rhs.getWeight() &&
lhs.getSrcNum() == rhs.getSrcNum() &&
lhs.getDestNum() == rhs.getDestNum();
}