несколько значений в одном векторном индексе

#c

#c

Вопрос:

Я нашел этот код в Интернете для списка смежности, который использует вектор пары целых чисел. Я пытаюсь понять код и не могу понять, что делает эта конкретная строка в функции addEdge: adj[u].push_back(make_pair(v, wt)); . adj — это имя вектора. Я запутался в методе печати. Когда он печатается, я не понимаю, где хранится исходный узел. Я понимаю, что конечный узел и вес хранятся как пара, но где сохраняется исходный узел int? Я попытался поэкспериментировать с кодом, чтобы понять, что происходит, как видно из этой строки в функции печати: cout << "Index: " << u << " "; но это не помогло. Вот код:

 void addEdge(vector <pair<int, int> > adj[], int u, 
                                     int v, int wt) 
{ 
    adj[u].push_back(make_pair(v, wt)); 
    adj[v].push_back(make_pair(u, wt)); 
} 
  
// Print adjacency list representaion ot graph 
void printGraph(vector<pair<int,int> > adj[], int V) 
{ 
    int v, w; 
    for (int u = 0; u < V; u  ) 
    { 
        cout << "Node " << u << " makes an edge with n"; 
        for (auto it = adj[u].begin(); it!=adj[u].end(); it  ) 
        { 
            cout << "Index: " << u << " ";
            v = it->first; 
            w = it->second; 
            cout << "tNode " << v << " with edge weight ="
                 << w << "n"; 
        } 
        cout << "n"; 
    } 
} 
  
// Driver code 
int main() 
{ 
    int V = 5; 
    vector<pair<int, int> > adj[V]; 
    addEdge(adj, 0, 1, 10); 
    addEdge(adj, 0, 4, 20); 
    addEdge(adj, 1, 2, 30); 
    addEdge(adj, 0, 3, 40); 
    addEdge(adj, 1, 4, 50); 
    addEdge(adj, 2, 3, 60); 
    addEdge(adj, 3, 4, 70); 
    addEdge(adj, 0, 2, 10);
    printGraph(adj, V); 
}
  

Для справки, это выходные данные для первых двух узлов:

Узел 0 создает ребро с
индексом: 0 Узел 1 с весом ребра = 10
Индекс: 0 Узел 4 с весом ребра = 20
Индекс: 0 Узел 3 с весом ребра = 40
Индекс: 0 Узел 2 с весом ребра = 10

Узел 1 создает ребро с
индексом: 1 Узел 0 с весом ребра = 10
Индекс: 1 Узел 2 с весом ребра = 30
Индекс: 1 Узел 4 с весом ребра = 50

Комментарии:

1. итак, как вы можете получить доступ к вектору с помощью скобок? Это в значительной степени то, что vector делают s. Я рекомендую обратиться к хорошей документации . Это значительно упрощает работу.

2. @user4581301 я имел в виду использование скобок вместе с .push_back , потому что, когда я тестировал его в коде, он выдавал мне ошибку. При этом, не могли бы вы объяснить вопрос во второй половине сообщения: где сохраняется исходный узел?

Ответ №1:

Из вашего кода adj представляет собой массив векторов. Таким образом, adj[u] является вектором, а .push_back хранит узел в этом конкретном векторе. push_back() , begin() и end() — это методы в векторе. begin() возвращает итератор к первому элементу (в вашем случае это пара), поэтому он является итератором для пары, и вы получаете доступ к элементам, используя it-> first и it-second, и переходите к следующему элементу (итерации), используя it