如何使用矢量矢量来读取图形?

时间:2017-04-01 06:49:14

标签: c++ c++11 stl graph-algorithm

#include <iostream>
#include <vector>
using namespace std;
void addEdge( vector<vector<int> > adj, int, int);
void print_graph(vector<vector<int> > adj);


int main()
{

    vector<vector<int> > adj(4);
    addEdge(adj,1,2);     // edge from node 1 to node 2
    addEdge(adj,1,3);
    addEdge(adj,1,4);
    addEdge(adj,2,3);
    addEdge(adj,3,4);
    print_graph(adj);
    return 0;
}

void addEdge(vector<vector<int> > adj, int u , int v)
{
    adj[u].push_back(v);

}

void print_graph( vector<vector<int> > adj)
{
    for( int i = 0; i < adj.size() ; i++ )
    {
        for( int j = 0 ; j < adj[i].size(); j++ )
        {
            cout<< i+1 << " , " << cout<< adj[i][j]<<endl;
        }
    }
}

我已经编写了阅读图表并打印图片的代码 在此之前阅读图表我曾经使用

vector<int>adj[5]; 

但我被告知,使用

`vector<vector<int> > adj`  or `list<list<int> > adj`  

我试过,但现在我得到没有输出 (更新)

任何人都可以帮助我使用矢量?请帮助列表

4 个答案:

答案 0 :(得分:3)

要使用vector vector你可以写

std::vector<std::vector<int>> adj(5); // Note: round parentheses

这是有效的,因为标准向量有一个构造函数,它接受所请求的大小作为参数,并默认初始化所有元素。

adj作为向量的向量,adj的元素将被初始化为空向量,以后可以用push_back填充。

答案 1 :(得分:1)

您的addEdge版本需要adj作为副本。您操纵该副本,然后在函数返回时销毁该副本。您需要使用引用来访问外部的adj:

void addEdge(vector<vector<int> >& adj, int u , int v)
{
    adj[u].push_back(v);

}

并使用:

void print_graph(const vector<vector<int> >& adj)

避免另一个副本

答案 2 :(得分:0)

向量使用从零开始的索引。 adj[0]是向量中的第一个元素。

此外,矢量开始没有大小。在添加一个元素之前,不会有adj[0]元素。

在尝试拨打adj.resize(4)之前,您可能需要adj[u].push_back(v)

答案 3 :(得分:0)

创建向量adj时,您有一个空向量。在您的函数addEdge中,您可以访问adj中索引为u的条目。但请记住,那是一个空的载体。这就是你的崩溃所在。

我假设你的函数addEdge应该为你正在创建的这个邻接矩阵添加一个条目。在此之前,您需要为该矩阵创建空间。意思是,你需要在你的adj向量中为它包含的向量创建空间,你还需要在那些可以放置边信息的向量中创建空间。

一旦你设置了矢量,你的打印功能仍将打印全部0,因为你的函数addEdge会复制你传递的矢量,然后写入该副本。原始的adj向量将保持不变。如果要修改原始文件,请务必通过指针传递矢量。