这是使用模板的图形的标准BFS算法。该算法适用于除字符串以外的所有基本数据类型。我知道是由null值传递给std :: string()引起的,但是我无法弄清楚为什么在代码的第一位应该有一个null字符串。
#include <bits/stdc++.h>
using namespace std;
template < typename T >
class Graph {
unordered_map < T, list < T >> adjList;
public:
void addEdge(T u, T v, bool birdir = true) {
adjList[u].push_back(v);
if (birdir)
adjList[v].push_back(u);
}
void printG() {
for (auto i: adjList) {
cout << i.first << "->";
for (auto nodes: i.second) {
cout << nodes << ",";
}
cout << endl;
}
}
void BFS(T src) {
queue < T > Q;
unordered_map < T, bool > visited;
Q.push(src);
//Q.push(nullptr);
visited[src] = true;
while (!Q.empty()) {
T f = Q.front();
Q.pop();
cout << f << " -- ";
for (auto neighbor: adjList[f]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
Q.push(neighbor);
}
}
}
}
};
int main() {
Graph < string > * g = new Graph < string > ();
g - > addEdge("0", "1", false);
g - > addEdge("1", "3");
//g->printG();
cout << endl;
g - > BFS(0);
}
答案 0 :(得分:1)
这里的问题是您如何呼叫BFS
。您使用
g - > BFS(0);
试图从std::string
构造一个0
。 0
是空指针常量,并且由于std::string
具有一个占用const char*
的重载,因此编译器将调用该构造函数。尽管这样做无效,因为指针不能为空指针。这会导致您遇到异常。您需要将代码更改为
g - > BFS("");
或更简单
g - > BFS();
答案 1 :(得分:1)
Graph<std::string>::BFS
是采用std::string
的成员函数。调用g->BFS(0);
时,0
用于构造std::string
参数,并调用采用const char*
的构造函数。这称为std::string::string(nullptr)
。
为避免0
在gcc中的代码中解释为空指针,请使用-Wzero-as-null-pointer-constant
。您可能是说g->BFS("0")
(字符串"0"
)