2014-02-18 47 views
0

在這個程序中,我在標記的線路上出現錯誤。stl庫:我是新來stl庫和麪臨編譯錯誤

我是新來的stl庫,因此無法理解它。 在下面的代碼我想使用向量和列表的STL庫,並試圖使鄰接表

#include "stdafx.h" 
#include<iostream> 
#include<stdio.h> 
#include<vector> 
#include<list> 

using namespace std; 

void add_vertex(vector< list<int> > *adjlist) 
{ 
    adjlist->push_back(list<int>());//adding vertex 
} 

void add_edge(vector< list<int> > *adjlist,int x,int y) 
{ 
    adjlist[x].push_back(y); //adding edge 
    // ^^^^ some error here ^^^^ 
} 

int main(int argc, char* argv[]) 
{ 
    int t,n,i,j; 
    int s[500],d[500]; 
    int max =0,tmpl; 
    //int vertex[500] ={0,}; 

    vector< list<int> > adjlist;//adjacency list 

    scanf("%d",&t); 

    for(i=0;i<t;i++) 
    { 
     scanf("%d",&n); 
     for(j =0;j<n;j++) 
     { 
      scanf("%d %d",&s[j],&d[j]); 

      tmpl = (s[j]>d[j])?s[j]:d[j]; 
      if(max < tmpl) 
       max = tmpl; 
     } 

     for(j =0;j<max;j++) 
     { 
      add_vertex(&adjlist); 

     } 
     for(j=0;j<n;j++) 
     { 
      add_edge(&adjlist,s[j],d[j]);//adding edge into the list 
     } 
    } 
    return 0; 

} 
+1

除非您告訴我們**錯誤是什麼**我們將很難告訴您如何解決這個問題 –

+0

沒有大膽的線條。我猜大膽的標記在複製和粘貼過程中丟失了。 – usr1234567

+0

不是傳遞指針,而是在你的函數中傳遞對'adjlist'的引用。 – rubenvb

回答

0

您正在使用c語法傳遞變量,c++使用&(額外benifit,它不會產生一個新的副本)。

這編譯:

#include<iostream> 
#include<stdio.h> 
#include<vector> 
#include<list> 
using namespace std; 

    void add_vertex(vector< list<int> > &adjlist) 
    { 

     adjlist.push_back(list<int>());//adding vertex 

    } 

    void add_edge(vector< list<int> > &adjlist,int x,int y) 
    { 


     adjlist[x].push_back(y);//adding edge 

    } 

    int main(int argc, char* argv[]) 
    { 
     int t,n,i,j; 
     int s[500],d[500]; 
     int max =0,tmpl; 
     //int vertex[500] ={0,}; 

     vector< list<int> > adjlist;//adjacency list 

     scanf("%d",&t); 

     for(i=0;i<t;i++) 
     { 
      scanf("%d",&n); 
      for(j =0;j<n;j++) 
      { 
       scanf("%d %d",&s[j],&d[j]); 

       tmpl = (s[j]>d[j])?s[j]:d[j]; 
       if(max < tmpl) 
        max = tmpl; 
      } 

      for(j =0;j<max;j++) 
      { 
       add_vertex(adjlist); 

      } 
      for(j=0;j<n;j++) 
      { 
       add_edge(adjlist,s[j],d[j]);//adding edge into the list 
      } 
     } 
     return 0; 

    } 
2

在功能上的add_edge改變這種說法

adjlist[x].push_back(y); 

(*adjlist)[x].push_back(y); 

但在任何情況下,它會更好地定義功能和其他類似函數 具有對vecto類型引用的第一個參數r比指向矢量的指針。例如

void add_edge(vector< list<int> > &adjlist, int x, int y) 
{ 
    adjlist[x].push_back(y); 
}