【问题标题】:How to have your own Node structure in a forward_list in C++?如何在 C++ 的 forward_list 中拥有自己的节点结构?
【发布时间】:2013-08-18 22:48:16
【问题描述】:

我如何结合自己的典型 类型定义节点 { 整数数据;整数数据1;节点* 下一个} 制作一个 forward_list ?我想我可以扔掉 Node* next (即 typedef Node { int data, int data1} )并让 STL 通过 forward_list 管理指针,但是如何删除指向特定 Node 的指针? forward_list 上的标准迭代器是 long int 而不是 Node ;所以如果我使用我的节点创建一个链表,我如何从该列表中删除一个节点

【问题讨论】:

    标签: c++ linked-list forward-list


    【解决方案1】:

    我想我接下来可以扔掉 Node* 并让 STL 管理 指针

    是的,这是你应该做的

    如何删除指向特定节点的指针?

    std::forward_list::remove
    std::forward_list::erase_after
    std::forward_list::remove_if
    std::forward_list::pop_front
    std::remove
    std::remove_if
    

    给出不同的算法从列表中删除节点

    如何从该列表中删除节点?

    按照link中的示例进行操作

    【讨论】:

    • 我认为您没有完全回答我的问题,换句话说,一旦我的 struct Node 在 forward_list 中,我如何从 forward_list 取回 Node* ?例如,有人让我写一个函数:removeNodefromList (forward_list input_list, Node* to_remove) - 你会怎么写?如果我使用迭代器迭代元素,我似乎无法取回 Node *,即使每个元素都是 Node *
    • 你应该用removeNodefromList (forward_list<Node>, std::forward_list<Node>::const_iterator)之类的东西替换你的函数,并使用标准的删除算法。使用 c++ 库,您希望使用迭代器来替换指针。注意std::list在这种情况下效率更高
    • 当然,如果改成迭代器,就很简单了。所以可以说,有人给了我一个结构节点并要求我用它制作一个单链表,在这种情况下我不应该使用 forward_list STL 吗?因为设计师会要求我根据 Node 和 Node* 来编写所有 API,因为他没有迭代器的概念,因此我不同意将 API 从 Node* 重新定义为迭代器。所以我应该编写自己的链表类并自己处理指针?
    • 如果其他人设计了Node 结构并让您负责管理Node 实例的容器,那么您有责任指定Node 实例的索引方式。如果由于某种原因他强加了Node* 索引,您仍然可以使用 C++ 容器并在查询时返回实例的地址。删除需要遍历容器并找到他提供的地址的实例,一旦找到就可以得到一个迭代器并使用C++删除算法
    • 由于Node*算法不能用于迭代列表,至少对不可变实例使用Node const* const,对可变实例使用Node* const
    猜你喜欢
    • 2022-01-05
    • 2019-01-29
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多