使用c ++向量的有向图的邻接列表表示

时间:2015-12-29 10:13:00

标签: c++ graph adjacency-list

我是新来者。我面临着c ++ vector及其迭代器的问题。我试图表示有向图的邻接列表但是失败了。这是我的代码:`

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int Node,Edge,node1,node2,cost;
    vector<int>nodes[100],costs[100];
    vector<int>::iterator it;
    cout<<"Enter numbers of nodes: "<<endl;
    cin>>Node;
    cout<<"Enter numbers of edges: "<<endl;
    cin>>Edge;
    for(int i=0;i<Edge;i++){
        cout<<i+1<<"th edge's Node1: ";
        cin>>node1;
        cout<<i+1<<"th edge's Node2: ";
        cin>>node2;
        cout<<"Cost from "<<node1<<" to"<<node2<<": ";
        cin>>cost;
        cout<<endl;
        nodes[node1].push_back(node2);
        costs[node1].push_back(cost);
    }
    for(it=nodes.begin();it<nodes.end();it++){
        for(int i=0;i<nodes[it].size();i++){
            cout<<nodes[it][i]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

`

1 个答案:

答案 0 :(得分:1)

您应该告诉我们您遇到的编译错误。

尝试编译代码会立即显示循环中的不一致:

for(it=nodes.begin();it<nodes.end();it++)

以及it的以下用法。实际上,您在索引中使用it,就好像它是int一样。但是你已经将它声明为迭代器:

vector<int>::iterator it;  // you say it is an iterator that iterates through integers in ONE vector

Inexed访问和迭代器是两个不同的概念。

解决方案1:使用索引

只需使用int类型的索引(或更好size_t):

...
const size_t maxnodes=100; 
vector<int>nodes[maxnodes],costs[maxnodes];
// + remove the definition of it
...
for(size_t it=0;it<maxnodes;it++) {
...

解决方案2:使用迭代器,但正确

让编译器为迭代器定义正确的类型,然后取消引用迭代器(即将其处理为指针):

// remove the definition of the it at the begin of main
...  // rest of code unchanged except for the loop
for(auto it=begin(nodes);it!=end(nodes);it++){  // attention at the condition
    for(int i=0;i<it->size();i++){
        cout<<(*it)[i]<<" ";
    }
    cout<<endl;
}

这是live demo

解决方案3:使用舒适范围

忘掉迭代器并让编译器为你处理这个工作:

for(auto& n : nodes) {  // note the &, to get the original element and not a clone of it
    for(int i=0;i<n.size();i++){
        cout<<n[i]<<" ";
    }
    cout <<endl;
}

这是另一个live demo

您将立即意识到您还可以使用范围来处理内循环:

    for(int& target : n) {  // when reading the code outloud, say " in " instead of ":"
        cout<<target<<" ";
    }

最后评论

您应始终验证用户的数据输入,尤其是在您将其用作索引时确保其处于有效范围内。