2016-07-14 32 views
-2

グラフを作成しようとしています。 2つの値のペアです(int)。このため私はリストadj pii (pair<int, int>)のリストを作成しました。今、私はpush_backに、リスト内のPIIタイプのノードをしようとすると、それはエラー: '演算子[]'に一致しません(オペランドの種類は 'std :: list <std :: pair <int, int> *'および 'std :: pair <int, int>')

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

言うここに私のコードです。 (私はまだmain()からエッジを追加していません)。私は必要なすべてのヘッダーを含めました。私は検索しましたが、同様のエラーは見つかりませんでした。

#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 ...あなたは 'std :: pair '型を添字として索引付けしていますが、 'long long int'ではなく、そうですか? 'n'(' pii')の*型*を見てください。これは明らかにマクロ内に隠すために広範囲に試みました。 – WhozCraig

+0

難読化されています。奇妙なマクロを使わないでください。あなた自身のコードを読むことができます:P – user463035818

+0

@WhozCraig 'n'は' pair 'だけですがpiiタイプです。あなたが何を言おうとしているか分かりません。 – Sarthak

答えて

2

adjポインタである、タイプstd::list<std::pair<int, int>>*です。

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

あなたは符号付き整数であるstd::ptrdiff_tの種類とoperator[]を呼び出す必要があります:ポインタは、あなたが次のことを呼び出そうとしている以下のoperator[]

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

を実装します。

他の人が言ったように
void graph::addEdge(***int*** n, pii m) 
{ 
    adj[n].push_back(m);  //Error Line 
} 
1

は、あなたの質問に直接答えは、あなたが(あなたが#definedpair<int,int>として持っている)piiでインデックスへのポインタをしよう、とpii以来、整数への自動変換を持っていないことですインデックスとして使用することはできません。

変数とメソッドの名前が簡略化されているため、実際に何をしようとしているのか分かりません。 adjがリストの配列であるというあなたの意図ですか?その場合は、addEdgeの最初のパラメータをintに変更するだけで、この配列のインデックスとして使用できます。しかし、方法bfsを見てみると、おそらくadjはリストになることを意図しています。この場合、アスタリスクをその宣言から削除して、グラフコンストラクタでの割り当てを取り除き、インデックスを完全に削除することができます。または、あなたがしようとしているものがpiiを別のpiiにマッピングする場合は、std::listの代わりにstd::mapのようなものを使用する必要があります。

+0

私はこの問題[リンク](http://www.spoj.com/problems/HERDING/)を解決しています。私は、行列の座標からグラフを作成し、BFSを適用し、その数を数えることを考えました。接続されたコンポーネントの私の意図は、各リストが隣接するノードを格納するリストの配列として 'adj'を使うことです。だから私は問題に現在のノード 'n'に隣接ノード' m'を挿入しようとしていました。したがって、私はpiiとして(ノードのために) 'n'を宣言しました。しかし、今私はペア値を反復できないことを知っているので、ペア値をリストに格納して反復する方法を知る必要があります。 – Sarthak

+0

興味深い問題。私は、BFSがここでどのように適用されるかについてはあまりよく分かりません(私は木に関係するBFSは理解していますが、このような一般的なグラフは理解しません)。あなたが提供したコードに欠けている問題に関連するロジックがたくさんあるので、あなたを特定の方向に導くことが難しいと思っています。 'bfs'メソッドの目的は何ですか? –

関連する問題