2016-07-14 5 views
-2

Ich versuche, ein Diagramm zu erstellen, wo jeder Knoten ist ein Paar von zwei int Werten. Dazu habe ich eine Liste adj vom Typ pii (pair<int, int>) erstellt. Nun, wenn ich zu push_back einen PII-Typ-Knoten in der Liste versuchen, sagt esFehler: keine Übereinstimmung für 'operator []' (Operandentypen sind 'std :: list <std :: pair <int, int>> *' und 'std :: pair <int, int>')

error: no match for 'operator[]' (operand types are 'std::list<std::pair<int, int> >*' and 'std::pair<int, int>')|

Hier mein Code. (Ich habe die Kanten noch nicht von main() hinzugefügt). Ich habe alle notwendigen Header eingefügt. Ich habe gesucht, kann aber keinen ähnlichen Fehler finden.

#define pii pair<int, int> 
#define lli long long int 
using namespace std; 

class graph 
{ 
    lli v; 
    list<pii> *adj; 
    public: 
    graph(lli v); 
    void addEdge(pii n, pii m); 
    void bfs(pii s); 
}; 

graph::graph(lli v) 
{ 
    this->v = v; 
    adj = new list<pii >[v]; 
} 

void graph::addEdge(pii n, pii m) 
{ 
    adj[n].push_back(m);  //Error Line 
} 

void graph::bfs(pii s) 
{ 
    bool visited[v]; 
    memset(visited, false, sizeof(visited)); 

    list<pii> q; 
    list<pii>::iterator it; 
    q.push_back(s); 
    while(!q.empty()) 
    { 
     pii temp = q.front(); 
     q.pop_front(); 
     for(it = adj[temp].begin() ; it != adj[temp].end() ; it++) 
     { 
      if(!visited[*it]) 
      { 
       visited[*it] = true; 
       q.push_back(*it); 
      } 
     } 
    } 
} 

int main() 
{ 
    int n, m, i, j; 
    pii coordinates; 
    cin>>n>>m; 
    char input[n][m]; 
    for(i = 0 ; i < n ; i++) 
    { 
     for(j = 0 ; j < m ; j++) 
     { 
      cin>>input[i]; 
      make_pair(i, j); 
     } 
    } 
    graph(n*m); 
    return 0; 
} 
+0

Um ... Sie wissen, dass Sie mit einem 'std :: pair ' Typ als den Index, nicht ein 'long long int ', richtig? Schau dir den * Typ * von 'n' (' pii') an, den du anscheinend ausgiebig versucht hast, ihn in einem Makro zu verstecken. – WhozCraig

+0

Verschleierung erfolgreich. Verwende keine seltsamen Makros und du wirst in der Lage sein, deinen eigenen Code zu lesen: P – user463035818

+0

@WhozCraig 'n' ist ein Pii-Typ, der nur" Paar "ist. Nicht sicher, was du sagen willst. – Sarthak

Antwort

2

adj ist vom Typ std::list<std::pair<int, int>>*, der ein Zeiger ist. Pointers implementieren die folgenden operator[]

T & operator[](T *, std::ptrdiff_t); 

Sie versuchen, die folgenden zu nennen:

T& operator(T*, std::pair<int, int>); 

Sie benötigen operator[] mit einer Art von std::ptrdiff_t zu nennen, die eine signierte ganze Zahl ist.

void graph::addEdge(***int*** n, pii m) 
{ 
    adj[n].push_back(m);  //Error Line 
} 
1

Wie andere gesagt haben, ist die direkte Antwort auf Ihre Frage, dass Sie einen Zeiger auf Index mit einem pii versuchen (die Sie #defined als pair<int,int> haben), und da ein pii hat keine automatische Konvertierung in eine Ganzzahl Es kann nicht als Index verwendet werden.

Mit Blick auf das breitere Bild, aufgrund Ihrer abgekürzten Variablen und Methodennamen, ist es schwer zu sehen, was Sie versuchen zu tun. Ist Ihre Absicht, dass adj ein Array von Listen sein? Wenn dies der Fall ist, müssen Sie nur den ersten Parameter zu addEdge auf int ändern, damit er als Index in dieses Array verwendet werden kann. Aber von einem schnellen Blick durch die Methode bfs, sieht es so aus, als ob adj nur eine Liste sein soll, in diesem Fall können Sie das Sternchen aus seiner Deklaration entfernen und seine Zuweisung im Graphkonstruktor eliminieren, und die Indizierung ganz eliminieren. Oder wenn Sie versuchen, einen pii zu einem anderen pii zuzuordnen, müssten Sie etwas wie std::map anstelle von std::list verwenden.

+0

Ich löse dieses Problem [link] (http://www.spoj.com/problems/HERDING/).Ich dachte daran, aus den Matrixkoordinaten ein Diagramm zu machen und dann BFS anzuwenden und das Nein zu zählen. von verbundenen Komponenten. Meine Absicht ist, 'adj' als ein Array von Listen zu verwenden, in denen jede Liste die benachbarten Knoten speichert. Also habe ich versucht, den benachbarten Knoten 'm' in den aktuellen Knoten' n' des Problems einzufügen. Daher erklärte ich 'n' als pii (weil es ein Knoten ist). Aber jetzt weiß ich, dass ich mit einem Paarwert nicht iterieren kann, also muss ich wissen, wie ich Paarwerte in der Liste speichere und es iteriere? – Sarthak

+0

Interessantes Problem. Ich bin mir nicht ganz sicher, wie BFS hier zutrifft (ich verstehe BFS, wenn es um einen Baum geht, aber nicht um einen allgemeinen Graphen wie diesen), noch genau, was Sie meinen, indem Sie aus den Matrixkoordinaten einen Graphen machen. Und es gibt so viel Logik in Bezug auf das Problem, das in dem von Ihnen bereitgestellten Code fehlt. Ich finde es schwierig, Sie in eine bestimmte Richtung zu führen. Wie ist der Zweck der 'bfs' Methode? –