C++ C+的问题+;图的指针、迭代器、邻接表表示

C++ C+的问题+;图的指针、迭代器、邻接表表示,c++,pointers,iterator,C++,Pointers,Iterator,我之前有一篇帖子:收到了一些关于指针的非常有用的信息。在以更好的理解实施更改后,我仍然有一些非常奇怪的行为: 创建两个顶点,然后在它们之间创建一条无向边。每个顶点都有一个指向与其关联的边的指针列表。使用此图,边计数不应为0。但是在计算边的过程中,我发现我的边列表得到了不同的位置,这可能解释了我的计算问题 以下是couts的简短读数: 顶点1列表的地址:0x1851018 顶点2列表的地址:0x1851038 在顶点1,我们有。。。 边缘列表的地址是。。。0x1851068 在顶点2,我们有。。。

我之前有一篇帖子:收到了一些关于指针的非常有用的信息。在以更好的理解实施更改后,我仍然有一些非常奇怪的行为:

创建两个顶点,然后在它们之间创建一条无向边。每个顶点都有一个指向与其关联的边的指针列表。使用此图,边计数不应为0。但是在计算边的过程中,我发现我的边列表得到了不同的位置,这可能解释了我的计算问题

以下是couts的简短读数:

顶点1列表的地址:0x1851018 顶点2列表的地址:0x1851038

在顶点1,我们有。。。 边缘列表的地址是。。。0x1851068

在顶点2,我们有。。。 边缘列表的地址是。。。0x1851098

#include "MinCut.h"
#include <iostream>
#include <list>

struct undirected_edge;
class vertex;

struct undirected_edge
{
    vertex * start;
    vertex * end;
};

class vertex
{
    int vertexLabel;
    std::list<undirected_edge*> edgeList;
public:
    int getVertexNumber(){return vertexLabel;}
    std::list<undirected_edge*> * getPointerOfEdgeList(){
        std::cout << vertexLabel << " has edge List at: " << &edgeList << "\n";
    return &edgeList;}

    vertex(int n){vertexLabel=n;}
};


class undirected_graph
{
private:
    std::list<vertex>  graph;

public:
    void addVertex(vertex * v){graph.push_back(*v);}
    void createEdge(vertex * v1, vertex * v2);
    undirected_edge * getRandomEdge();
    void removeEdge(undirected_edge * e);
    int getNumberOfNodes(){return graph.size();}
    int getNumberOfEdges();
};
void buildGraph(undirected_graph *);

void undirected_graph::createEdge(vertex * v1, vertex * v2)
{
    std::list<undirected_edge*> * e1 = v1->getPointerOfEdgeList();
    std::list<undirected_edge*> * e2 = v2->getPointerOfEdgeList();
    undirected_edge * e = new undirected_edge;
    e->start=v1;
    e->end=v2;
    e1->push_back(e);
    e2->push_back(e);
    std::cout<< "The address of vertex 1's list: " << e1 << "\n";
    std::cout<< "The address of vertex 2's list: " << e2 << "\n";
}

int undirected_graph::getNumberOfEdges()
{    
    int size = getNumberOfNodes();
    std::list<vertex>::iterator it = graph.begin();
    int counter = 0;
    for (int i = 0; i < size; i++)
    {
        std::cout<<"At Vertex " << it->getVertexNumber() << " we have...\n";
        std::cout<<"The address of the edge list is... " << it->getPointerOfEdgeList() << "\n";
        counter = counter + it->getPointerOfEdgeList()->size();
        std::cout<<it->getPointerOfEdgeList()->size()<<"\n";
        it++;
    }
    return counter;
}


int main()
{
    undirected_graph myGraph;
    buildGraph(&myGraph);
    return 0;
}

void buildGraph(undirected_graph * g)
{
    vertex * v1 = new vertex(1);
    vertex * v2 = new vertex(2);

    g->addVertex(v1);           
    g->addVertex(v2);
    g->createEdge(v1,v2);

    std::cout<<"The total number of edges: " << g->getNumberOfEdges();  
}
#包括“MinCut.h”
#包括
#包括
结构无向_边;
类顶点;
结构无向边
{
顶点*开始;
顶点*结束;
};
类顶点
{
int顶点标签;
标准:列表边缘列表;
公众:
int getVertexNumber(){返回vertexLabel;}
std::list*getPointerOfEdgeList(){
std::cout end=v2;
e1->推回(e);
e2->推回(e);

std::cout调用
addVertex(vertex*v)
时,可以使用
graph将顶点参数的副本添加到列表中。向后推(*v)
。因此顶点对象具有不同的地址


你可能想存储一个代码> STD::列表< /Calp>图,使用<代码>图。PuxEclipse(V)< /C> >,

谢谢!我终于得到了——我一直假设C++中的对象是通过引用传递的(比如java)。如果这是你的假设,为什么你要用指针来处理?——但是如果你是从java来的,那就解释你使用的代码>运算符new < /C>。请注意C++不是垃圾收集的。