Операция push_back для элемента Vector (C ++) - PullRequest
2 голосов
/ 26 мая 2020

Я - программист Python, пытающийся развить навыки C ++. У меня глупый вопрос о векторах.

Предположим, у меня есть такой вектор

vector<int> adj;

Предположим, он содержит некоторые значения. Что делает эта операция?

adj[v].push_back(w)

Создает ли она вектор векторов? Чем он отличается от,

vector<vector<int>> adj

для начала?

Edit :: Associated code - это простой BFS на графике, который компилируется и отлично работает.

class Graph 
{ 
    int V;  
    vector<int> *adj;    
public: 
    Graph(int V); 
    void addEdge(int v, int w);   
    void BFS(int s);   
}; 

Graph::Graph(int V) 
{ 
    this->V = V; 
    adj = new vector<int>[V]; 
} 

void Graph::addEdge(int v, int w) 
{ 
    adj[v].push_back(w); // Add w to v’s list. 
} 

Функция BFS есть в GeeksForGeeks

Ответы [ 5 ]

2 голосов
/ 26 мая 2020

В представленном вами коде adj создается как new list<int>[V]. Это не совсем то, о чем вы спрашиваете (т.е. это не вектор и не список, это динамически выделяемый массив списков ).

Затем:

adj[v].push_back(w)

Означает: получить элемент v в массиве списков (как v == индекс элемента для извлечения), это будет список, затем push_back в этот список w.

2 голосов
/ 26 мая 2020

Предполагая, что vector<int> adj:

adj[v].push_back(w) вызовет operator[] on adj, который вернет int & (при условии, что v - некоторый скаляр). Затем он попытается вызвать push_back на int &, который не сможет скомпилировать.

Предполагая, что vector<vector<int>> adj:

adj[v].push_back(w) вызовет operator[] on adj, который вернет vector<int> & (при условии, что v - некоторый скаляр). Затем он вызовет push_back для этого vector<int> &, добавив значение w к этому конкретному вектору.

1 голос
/ 26 мая 2020

В предоставленном определении класса нет вектора.

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 
1 голос
/ 26 мая 2020

Опубликованный вами код пытается вызвать push_back для элемента vector из int s. Это имеет смысл no , поскольку int не является объектом с функцией-членом push_back. Этот код не компилируется.

0 голосов
/ 26 мая 2020

У вас есть одномерный массив. Вы можете добавить только 1 элемент в индекс. То, что вы подразумеваете под adj[v].push_back(w), - это то, что вы хотите pu sh element w с индексом v, что невозможно, поскольку вы объявили вектор как

vector<int> adj;

Для реализации 2 -d вектор, вам нужно определить его как -

vector<vector<int> >adj;

В этом случае ваша операция adj[v].push_back(w) будет работать, если v является допустимым индексом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...