2016-09-04 2 views
0

Я только начал писать код на C++, поэтому я новичок в STL. Здесь я пытаюсь перебрать граф, хранящийся в виде вектора векторов.Итерирование вектора векторов в C++

#include <iostream> 
#include <vector> 
#include <iostream> 

using namespace std; 

int reach(vector<vector<int> > &adj, int x, int y) { 
    vector<vector<int> >::iterator it; 
    vector<int>::iterator i; 

    for (it = adj.begin(); it != adj.end(); it++) 
    { 
     cout << (*it) << endl; 
     if ((*it) == x) 
      for (i = (*it).begin(); i != (*it).end(); i++) 
      { 
       cout << (*i) << endl; 
       if ((*i) == y) 
        return 1; 

      } 
    } 
    return 0; 
} 

int main() 
{ 

} 

Я получаю ошибку std::vector<int> не является производным от сопзЬ Gnu Cxx. Может ли кто-нибудь указать мне в правильном направлении?

+3

'* it' is' vector ', а не один' int'. Как вы считаете, это означает отправить его в 'cout' или сравнить его с целым числом' x'? –

+0

упс! я вижу свою ошибку. Черт. Благодаря ! – RAHUL

ответ

2

* это указывает на вектор не Int, поэтому вы получаете ошибку

следующий код может работать для вас

#include <vector> 
    #include <iostream> 

    using namespace std; 

    int reach(vector<vector<int> > &adj, int x, int y) { 
    vector<vector<int> >::iterator it; 
    vector<int>::iterator i; 

    for (it = adj.begin(); it != adj.end(); it++) 
    { 
    cout << (*(*it).begin()) << endl; 
    if (((*(*it).begin())) == x) 
     for (i = (*it).begin(); i != (*it).end(); i++) 
     { 
      cout << (*i) << endl; 
      if ((*i) == y) 
       return 1; 

     } 
    } 
    return 0; 
    } 

    int main() 
    { 

    } 

для доступа к первому элементу вектора использования

(*(*it).begin()) in place of (*it) 

Если вы изучаете график, используйте массив векторов. Для получения более подробной информации перейдите по следующему URL: C++ Depth First Search (DFS) Implementation

1
cout << (*it) << endl; 

Здесь вы объявили it в виде:

vector<vector<int> >::iterator it; 

Поэтому *it является:

vector<int> 

Таким образом, вы пытаетесь использовать operator<<, чтобы отправить его в std::cout. Это, очевидно, не сработает. Это эквивалентно:

vector<int> v; 

cout << v; 

Там нет operator<< перегрузки, которая определена для того, что cout есть, и vector<int>. Как вы знаете, для того, чтобы распечатать содержимое вектора, вам нужно перебирать его отдельные значения и печатать его отдельные значения.

Итак, каковы бы ни были ваши намерения, когда вы писали:

cout << (*it) << endl; 

вам нужно будет сделать что-то другое, имея в виду, что *it здесь целая vector<int>. Возможно, ваше намерение состоит в том, чтобы перебирать вектор и печатать каждый вектор int, но вы уже делаете это позже.

Аналогично:

if ((*it) == x) 

Это не будет работать. Как объяснено, *it представляет собой vector<int>, который не может быть сравнен с равным int.

Непонятно, каковы ваши намерения здесь. «График, хранящийся как вектор или векторы», слишком расплывчато.

0

Следующий код компилируется с опцией std = C++ 11. Но x отсутствует в vector<vector<int>>. Если adj имел тип vector<pair<int, vector<int>>>, то это было бы лучше.

Следующий код компилируется для vector<vector<int>>, но не использует x.

using std::vector; 
using std::pair; 
using std::cout; 
using std::endl; 

int reach(vector<vector<int> > &adj, int x, int y) { 
    vector<vector<int> >::iterator it; 
    vector<int>::iterator i; 
    for(it=adj.begin();it!=adj.end();it++) 
     { 
      // cout << (*it) << endl; 
      for (const auto& nexts: *it) 
       cout << nexts << ' '; 
      cout << endl; 

      for(i=(*it).begin();i!=(*it).end();i++) 
      { 
       cout << (*i) << endl; 
       if((*i)==y) 
        return 1; 
       } 
      } 
    return 0; 
} 

Этот код компилируется <vector<pair<int, vector<int>>> и использует x.

using std::vector; 
using std::pair; 
using std::cout; 
using std::endl; 

int reach(vector<pair<int, vector<int> > > &adj, int x, int y) { 
    vector<pair<int, vector<int> > >::iterator it; 
    vector<int>::iterator i; 
    for(it=adj.begin();it!=adj.end();it++) 
     { 
      cout << it->first << endl; 

      if (it->first == x) 
       for(i=it->second.begin();i!=it->second.end();i++) 
       { 
        cout << (*i) << endl; 
        if((*i)==y) 
         return 1; 

        } 
       } 
    return 0; 
}