инициализация вектора в с ++ - PullRequest
0 голосов
/ 23 мая 2018

Может кто-нибудь объяснить мне, почему verticies.size () в конструкторе Graph равен '4', но при повторном вызове в addEdge verticies.size () равен 0?Программа вылетает на вершинах [fromVertex] .addEdge (toVertex), потому что размер вершин равен 0.

Я уверен, что это то, что я должен знать, но я не понимаю, в чем я ошибаюсь.

class Vertex {

public:
    int value;
    vector<int> adj;
    bool isVisited = false;

    Vertex(int _value)
    {
        value = _value;
    }

    void addEdge(int destination)
    {
        adj.push_back(destination);
    }   
};

class Graph
{

public:

    int vertexCount;    // No. of vertices            
    vector<Vertex> verticies;

    Graph(int _vertexCount)
    {
        this->vertexCount = _vertexCount;
        vector<Vertex> verticies;
        for (size_t i = 0; i < _vertexCount; i++)
        {
            Vertex v = Vertex(i);
            verticies.push_back(v);
        }
        cout << "verticies count " << verticies.size() << endl;
    }
    void addEdge(int fromVertex, int toVertex)  
    {
        cout << "verticies count in addEdge: " << verticies.size() << endl;
        verticies[fromVertex].addEdge(toVertex); 
    }
    void findPath(int fromVertex, int toVertex, vector<int> pathSoFar)  
    {
        pathSoFar.push_back(fromVertex);
        if (fromVertex == toVertex)
        {
            for (int i = 0; i < pathSoFar.size(); i++)
            {
               cout << pathSoFar.at(i) << " ";
            }
            cout << endl;
            return;
        }
        else
        {
            for (size_t i = 0; i < verticies[fromVertex].adj.size(); i++)
            {   
                int nextToVisit = verticies[fromVertex].adj.at(i);
                if (verticies[nextToVisit].isVisited == false)
                {
                    findPath(nextToVisit, toVertex, pathSoFar);
                }

            }
        }
    }
};

int main()
{
    // Create a graph given in the above diagram
    Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 0);
    g.addEdge(2, 3);
    g.addEdge(3, 3);


    vector<int> path;
    g.findPath(2, 1, path);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Здесь вы скрываете свое поле класса:

Graph(int _vertexCount)
{
    this->vertexCount = _vertexCount;
    vector<Vertex> verticies;  // <--- exactly here
    for (size_t i = 0; i < _vertexCount; i++)
    {
        Vertex v = Vertex(i);
        verticies.push_back(v);
    }
    cout << "verticies count " << verticies.size() << endl;
}

И вы делаете все операции локально (в контексте конструктора) verticies вместо Graph::verticies.Кстати, правильное английское множественное число - vertices.

0 голосов
/ 23 мая 2018

Может кто-нибудь объяснить мне, почему verticies.size () в конструкторе Graph равен '4', но при повторном вызове в addEdge verticies.size () равен 0?

Это потому, чтоэто два разных объекта.Здесь

Graph(int _vertexCount)
{
    this->vertexCount = _vertexCount;
    vector<Vertex> verticies;
    // ....
}

Вы создаете локальный вектор с именем verticies, который затеняет переменную-член.Простое удаление этой строки должно быть хорошо.Я имею в виду, что вы уже объявили участника, нет необходимости делать это дважды;).

Более того, я бы посоветовал вам либо изменить размер вектора, прежде чем заполнять его данными, либо, по крайней мере, зарезервировать его до необходимой вам емкости.

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