我一直在尝试玩一会儿,我想重写一些代码以使教师更容易理解。
这是初始代码:
typedef pair<int, int> iPair;
// un graf directionat cu reprezentare prin lista de adiacenta
class Graph
{
int V; // Numar de noduri
// Lista care retine nodul si costul muchiei pentru fiecare pereche
list< pair<int, int> > *adj;
public:
Graph(int V); // constructorul
// adauga o muchie grafului
void addEdge(int u, int v, int w);
// printeaza mst-ul rezultat
void primMST(int numberElemOp);
};
// aloca memorie pentru lista de adiacenta
Graph::Graph(int V)
{
this->V = V;
adj = new list<iPair> [V];
}
void Graph::addEdge(int u, int v, int w)
{
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
自动取款机我想要一个自定义的配对:
# define INF 0x3f3f3f3f
// pereche int int denumita iPair
struct Pair {
int first;
int second;
};
struct Pair* newPair(int first, int second){
struct Pair* newPair = (struct Pair*)malloc(sizeof(struct Pair));
newPair->first = first;
newPair->second = second;
return newPair;
}
// un graf directionat cu reprezentare prin lista de adiacenta
class Graph
{
int V; // Numar de noduri
// Lista care retine nodul si costul muchiei pentru fiecare pereche
list< Pair > *adj;
public:
Graph(int V) {
this->V = V;
adj = new list<Pair> [V];
}; // constructorul
// adauga o muchie grafului
void addEdge(int u, int v, int w){
adj[u].push_back(newPair(v, w)); // http://www.cplusplus.com/reference/list/list/push_back/ pentru push back
adj[v].push_back(newPair(u, w));
};
我想我尊重类型和所有类型,但我不太清楚这个错误:
prog.cpp: In member function 'void Graph::addEdge(int, int, int)':
prog.cpp:35:33: error: no matching function for call to 'std::__cxx11::list<Pair>::push_back(Pair*)'
adj[u].push_back(newPair(v, w));
在我看来,我将自定义对输入到列表中,并且应该将其推送到列表中。有什么问题吗?
答案 0 :(得分:2)
您收到的编译错误是因为:
struct Pair* newPair(int first, int second);
...返回指向Pair
对象(Pair*
)的指针,所以当您这样做时:
adj[v].push_back(newPair(u, w));
...您正在尝试将Pair*
推入一个简单的Pair
的地方。
这里的简单解决方法是不动态分配Pair
对象:
// You don't need to prefix "Pair" with "struct" in C++:
Pair newPair(int first, int second) {
return { first, second };
}
您的代码还有其他一些缺陷,其中一些非常“危险”。您不应该手动分配std::list
的数组,这容易出错(您需要注意复制Graph
结构并释放内存),只需使用std::vector
:>
std::vector<std::list<Pair>> adj;
// No needs to store the value of V since you can retrieve it with adj.size()
Graph(int V) : adj(V) { }
此外,std::list
通常不是一个好主意。您应该使用std::vector
:
std::vector<std::vector<Pair>> adj;
Graph(int V) : adj(V) { }
您的Graph
的“更好”版本为:
struct Edge {
const int destination;
const int weight;
};
class Graph {
// Adjacency list:
std::vector<std::vector<Edge>> adj;
public:
Graph(int V) : adj(V) { }
void addEdge(int from, int to, int weight) {
adj[from].push_back({to, weight});
adj[to].push_back({from, weight});
}
};