C ++:basic_string :: _ M_construct null对于Graph BFS算法无效错误

时间:2019-04-01 18:55:33

标签: c++ string

这是使用模板的图形的标准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);
 }

2 个答案:

答案 0 :(得分:1)

这里的问题是您如何呼叫BFS。您使用

g - > BFS(0);

试图从std::string构造一个00是空指针常量,并且由于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"