Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的向量初始化+;_C++_Vector_Initialization - Fatal编程技术网

C++ c+中的向量初始化+;

C++ c+中的向量初始化+;,c++,vector,initialization,C++,Vector,Initialization,有人能解释一下为什么图形构造函数中的Vertices.size()等于“4”,但在addEdge Vertices中再次调用时,它却等于0吗?程序在垂直方向[fromVertex].addEdge(toVertex)处崩溃,因为垂直方向的大小为0 我肯定这是我应该知道的,但我不知道我错在哪里 class Vertex { public: int value; vector<int> adj; bool isVisited = false; Vert

有人能解释一下为什么图形构造函数中的Vertices.size()等于“4”,但在addEdge Vertices中再次调用时,它却等于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;
}
类顶点{
公众:
int值;
向量调整;
bool=false;
顶点(int_值)
{
值=_值;
}
无效添加(整数目的地)
{
向后推(目的地);
}   
};
类图
{
公众:
int vertexCount;//顶点数
矢量垂直;
图形(int\u vertexCount)
{
此->顶点计数=\u顶点计数;
矢量垂直;
对于(大小i=0;i<\u vertexCount;i++)
{
顶点v=顶点(i);
垂直。推回(v);
}
库特
有人能解释一下为什么图形构造函数中有vertices.size()
等于“4”,但在addEdge Vertices中再次调用时。size()是否等于0

这是因为这是两个不同的对象

Graph(int _vertexCount)
{
    this->vertexCount = _vertexCount;
    vector<Vertex> verticies;
    // ....
}
图形(int\u vertexCount)
{
此->顶点计数=\u顶点计数;
矢量垂直;
// ....
}
您正在创建一个名为
vertices
的局部向量,该向量对成员变量进行阴影处理。只需删除该行即可。我的意思是您已经声明了成员,无需执行两次;)


此外,我建议您在填充数据之前调整向量的大小,或者至少保留所需的容量。

这里您正在隐藏您的类字段:

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;
}
图形(int\u vertexCount)
{
此->顶点计数=\u顶点计数;

vector Vertices;//创建具有相同名称的局部变量(
Vertices
)比
图形中的成员
向量垂直方向;
构造函数主体中的成员正在生成一个新的局部向量,该向量将阴影化名为
垂直方向的成员
。这就是您正在初始化的内容。阴影化是否提示警告?取决于阴影化的内容和方式。成员变量,通常不是。@codekaizer保证生成warning?不,因为根据语言规范对变量进行阴影处理是完全有效的。可以生成警告吗?是的。使用正确的编译器标志-对于GCC,请查找
-Wshadow
(和朋友)。