如何创建指向另一个列表中的对象的指针列表?

时间:2012-12-05 07:22:14

标签: c++ list pointers

我正在创建一个简单的图形,其中所有节点(或顶点)都被收集到列表中。每个节点又有一个指针列表,这些指针可以指向第一个列表中的多个其他节点并调用这些边缘。例如,假设我有一个简单的图表A -> BA -> C,那么节点A会有一个指向BC的指针列表。

在创建图形时,我首先创建节点,并使用与该节点相关的任何内容(权重或任何其他属性)填充该节点。然后,我将节点添加到所有节点的“主”列表中。之后,我将该节点的地址(现在是列表中的最后一个对象)传递给要添加到任何父节点的函数:

AddChildNode(&MasterListOfNodes.back(), NameOfParent)

以下是将子节点添加到父

的代码
void GraphReader::AddChildNode(Vertex * const aChildVertex, const string aParent)
{
    for(list<Vertex>::iterator it = MasterListOfNodes.begin(); it != MasterListOfNodes.end(); it++)
    {
        if(it -> getName().compare(aParent) == 0)
        {
            it -> addEdge(aChildVertex);
            break;
        }
    }
}

addEdge只是将新Child添加到Parents“Edges”列表中:

const void Vertex::addEdge(Vertex * aEdge) {mEdges.push_back(aEdge);}

我遇到的问题是边缘列表指向列表对象的副本,而不是列表本身的实际对象:

VS and Printout of Root Nodes and Edges

注意:找到了根节点的地址(命令提示符输出),其中包含以下内容:

for (list<Vertex>::iterator it = MasterListOfNodes.begin(); it != MasterListOfNodes.end(); it++)
{
    cout << "Name: " << it->getName() << " | Address: {" << &(*it) << "}" << endl;
}

如何创建指向主节点的边缘列表?

1 个答案:

答案 0 :(得分:0)

当您使用:list<Vertex>时,列表数据结构将管理Vertex如何存储在内存中

您需要使用的是:list<Vertex *>

示例:

int main ()
{
    Vertex * a = new Vertex (..);

    list<Vertex*> v ();

    v.add(a);

    if (a == v[0])
    {
        // both points at the same Vertex in memory
    }

    return 0;
}