我的Graph实现面临问题,特别是printGraph()函数。此函数包含一个循环,用于打印图形的邻接表表示形式。如果我使用成员对象变量adj循环,那么它将向我显示正确的输出:

0 : 1 2 2
1 : 0 2
2 : 0 1 0 3
3 : 2 3 3

但是,如果我使用getter方法adjL(),那么它将为我提供错误的输出,该输出是:
0 : 0 0 2
1 : 0 0
2 : 0 0 0 3
3 : 0 0 3

我很可能犯了一个愚蠢的错误,但我似乎无法捕获它。任何帮助表示赞赏。我想我无法理解如何使用getter方法adjL()返回的值。
class UndirectedGraph {
    //vector<vector <int> > adj;
public:
    vector<vector <int> > adj;
    UndirectedGraph(int vCount);     /* Constructor */
    void addEdge(int v, int w);      /* Add an edge in the graph */
    vector<int> adjL(const int v) const ;    /* Return a vector of vertices adjacent to vertex @v */
    void printGraph();
};

UndirectedGraph::UndirectedGraph(int vCount): adj(vCount) {
}

void UndirectedGraph::addEdge(int v, int w) {
    adj[v].push_back(w);
    adj[w].push_back(v);
    edgeCount++;
}

vector<int> UndirectedGraph::adjL(const int v) const {
    return adj[v];
    //return *(adj.begin() + v);
}

void UndirectedGraph::printGraph() {
    int count = 0;
    for(vector<vector <int> >::iterator iter = adj.begin(); iter != adj.end(); ++iter) {
        cout << count << " : ";

        /*
        for(vector<int>::iterator it = adj[count].begin(); it != adj[count].end(); ++it) {
            cout << *it << " ";
        }
        */
        for(vector<int>::iterator it = adjL(count).begin(); it != adjL(count).end(); ++it) {
            cout << *it << " ";
        }

        ++count;
        cout << endl;
    }
}

int main() {
    UndirectedGraph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 0);
    g.addEdge(2, 3);
    g.addEdge(3, 3);

    g.printGraph();
}

最佳答案

由于adjL奇怪地按值返回,因此以下行被打断:

for(vector<int>::iterator it = adjL(count).begin(); it != adjL(count).end(); ++it) {

您正在比较来自两个不同容器的迭代器,并且将迭代器存储到立即超出范围的临时对象,如果不引起海森堡可能上交坟墓,则无法立即读取其值。
adjL应该返回一个const vector<int>&

10-07 16:02