В предоставленном определении класса нет вектора.
class Graph
{
int V;
list<int> *adj;
public:
Graph(int V);
void addEdge(int v, int w);
void BFS(int s);
};
Объявлен элемент данных, который имеет указатель типа на std::list<int>
.
В конструкторе класса
Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V];
}
динамически выделяется массив объектов типа std::list<int>
, а адрес первого элемента массива присваивается члену данных adj
.
Таким образом в этом операторе
adj[v].push_back(w);
выбирается элемент массива с индексом v
, adj[v]
, представляющий объект типа std::list<int>
, и к этому списку добавляется объект w
с использованием функции-члена push_back
шаблона класса std::list
.
Что касается векторов, вы действительно можете объявить вектор векторов, например
std::vector<std::vector<int>> v;
Чтобы использовать оператор индекса вам нужно создать необходимое количество элементов вектора.
Это можно сделать, например, когда объявлен вектор.
std::vector<std::vector<int>> v( 10 );
Это объявление объявляет вектор векторов с 10 элементами . Теперь вы можете использовать оператор нижнего индекса, чтобы добавить вложенные векторы к вектору с помощью функции-члена push_back
.
Вот демонстрационная программа.
#include <iostream>
#include <vector>
int main()
{
std::vector<std::vector<int>> v( 10 );
for ( size_t i = 0; i < v.size(); i++ )
{
int value = 0;
for ( size_t j = 0; j < i + 1; j++ )
{
v[i]. push_back( value++ );
}
}
for ( const auto &sub_vec : v )
{
for ( const auto &item : sub_vec )
{
std::cout << item << ' ';
}
std::cout << '\n';
}
return 0;
}
Ее результат -
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9