【问题标题】:How do I create a list of pointers that point to objects within another list?如何创建指向另一个列表中对象的指针列表?
【发布时间】:2012-12-05 07:22:14
【问题描述】:

我正在创建一个简单的图表,其中所有节点(或顶点)都收集到一个列表中。每个节点依次都有一个指针列表,这些指针可能指向第一个列表中的多个其他节点并调用这些边。例如,假设我有一个简单的图表,其中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 添加到父母“Edges”列表中:

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

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

注意:根节点的地址(命令提示符输出)通过以下方式找到:

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

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

【问题讨论】:

  • @JerryCoffin 要求(因为这是一个课堂作业)声明没有外部库
  • 可以在AddChildNode(&amp;MasterListOfNodes.back(), NameOfParent)之前添加操作吗?您在那里做错什么的可能性很小,但以防万一……另外,您是否有理由将节点添加到 MasterListOfNodes 但从 mInternalGraph 打印它们?
  • @Zeta 这是一个复制意大利面错误。对不起。
  • “边列表指向列表对象的副本”?一条边的类型为Vertex *,它怎么能指向list&lt;Vertex&gt;(除非你一直在做一些糟糕的转换)?我无法重现此错误。你能发布一个最小的完整示例吗?

标签: c++ list pointers


【解决方案1】:

当您使用:list&lt;Vertex&gt; 时,列表数据结构将管理顶点在内存中的存储方式

你需要使用的是:list&lt;Vertex *&gt;

例子:

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;
}

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2020-05-15
    • 2015-03-10
    • 2018-06-02
    相关资源
    最近更新 更多